Moose::Cookbook::Basics::Person_BUILDARGSAndBUILD - phpMan

Command: man perldoc info search(apropos)  


Sections
NAME VERSION SYNOPSIS DESCRIPTION MORE CONSIDERATIONS CONCLUSION AUTHORS COPYRIGHT AND LICENSE
NAME
    Moose::Cookbook::Basics::Person_BUILDARGSAndBUILD - Using BUILDARGS and
    BUILD to hook into object construction

VERSION
    version 2.2200

SYNOPSIS
      package Person;

      has 'ssn' => (
          is        => 'ro',
          isa       => 'Str',
          predicate => 'has_ssn',
      );

      has 'country_of_residence' => (
          is      => 'ro',
          isa     => 'Str',
          default => 'usa'
      );

      has 'first_name' => (
          is  => 'ro',
          isa => 'Str',
      );

      has 'last_name' => (
          is  => 'ro',
          isa => 'Str',
      );

      around BUILDARGS => sub {
          my $orig = shift;
          my $class = shift;

          if ( @_ == 1 && ! ref $_[0] ) {
              return $class->$orig(ssn => $_[0]);
          }
          else {
              return $class->$orig(@_);
          }
      };

      sub BUILD {
          my $self = shift;

          if ( $self->country_of_residence eq 'usa' ) {
              die 'Cannot create a Person who lives in the USA without an ssn.'
                  unless $self->has_ssn;
          }
      }

DESCRIPTION
    This recipe demonstrates the use of "BUILDARGS" and "BUILD". By defining
    these methods, we can hook into the object construction process without
    overriding "new".

    The "BUILDARGS" method is called *before* an object has been created. It
    is called as a class method, and receives all of the parameters passed
    to the "new" method. It is expected to do something with these arguments
    and return a hash reference. The keys of the hash must be attribute
    "init_arg"s.

    The primary purpose of "BUILDARGS" is to allow a class to accept
    something other than named arguments. In the case of our "Person" class,
    we are allowing it to be called with a single argument, a social
    security number:

      my $person = Person->new('123-45-6789');

    The key part of our "BUILDARGS" is this conditional:

          if ( @_ == 1 && ! ref $_[0] ) {
              return $class->$orig(ssn => $_[0]);
          }

    By default, Moose constructors accept a list of key-value pairs, or a
    hash reference. We need to make sure that $_[0] is not a reference
    before assuming it is a social security number.

    We call the original "BUILDARGS" method to handle all the other cases.
    You should always do this in your own "BUILDARGS" methods, since
    Moose::Object provides its own "BUILDARGS" method that handles hash
    references and a list of key-value pairs.

    The "BUILD" method is called *after* the object is constructed, but
    before it is returned to the caller. The "BUILD" method provides an
    opportunity to check the object state as a whole. This is a good place
    to put logic that cannot be expressed as a type constraint on a single
    attribute.

    In the "Person" class, we need to check the relationship between two
    attributes, "ssn" and "country_of_residence". We throw an exception if
    the object is not logically consistent.

MORE CONSIDERATIONS
    This recipe is made significantly simpler because all of the attributes
    are read-only. If the "country_of_residence" attribute were settable, we
    would need to check that a Person had an "ssn" if the new country was
    "usa". This could be done with a "before" modifier.

CONCLUSION
    We have repeatedly discouraged overriding "new" in Moose classes. This
    recipe shows how you can use "BUILDARGS" and "BUILD" to hook into object
    construction without overriding "new".

    The "BUILDARGS" method lets us expand on Moose's built-in parameter
    handling for constructors. The "BUILD" method lets us implement logical
    constraints across the whole object after it is created.

AUTHORS
    *   Stevan Little <stevan AT cpan.org>

    *   Dave Rolsky <autarch AT urth.org>

    *   Jesse Luehrs <doy AT cpan.org>

    *   Shawn M Moore <sartak AT cpan.org>

    *   יובל קוג'מן (Yuval Kogman) <nothingmuch AT woobling.org>

    *   Karen Etheridge <ether AT cpan.org>

    *   Florian Ragwitz <rafl AT debian.org>

    *   Hans Dieter Pearcey <hdp AT cpan.org>

    *   Chris Prather <chris AT prather.org>

    *   Matt S Trout <mstrout AT cpan.org>

COPYRIGHT AND LICENSE
    This software is copyright (c) 2006 by Infinity Interactive, Inc.

    This is free software; you can redistribute it and/or modify it under
    the same terms as the Perl 5 programming language system itself.


Generated by phpMan Author: Che Dong On Apache Under GNU General Public License - MarkDown Format
2026-05-23 08:44 @216.73.217.24 CrawledBy Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)
Valid XHTML 1.0 TransitionalValid CSS!

^_back to top