Class::MakeMethods::Template::Ref.3pm

Langue: en

Version: 2004-09-06 (debian - 07/07/09)

Section: 3 (Bibliothèques de fonctions)

NAME

Class::MakeMethods::Template::Ref - Universal copy and compare methods

SYNOPSIS

   package MyObject;
   use Class::MakeMethods::Template::Ref (
     'Hash:new'      => [ 'new' ],
     clone           => [ 'clone' ]
   );
 
 
   package main;
 
 
   my $obj = MyObject->new( foo => ["Foozle", "Bozzle"] );
   my $clone = $obj->clone();
   print $obj->{'foo'}[1];
 
 

DESCRIPTION

The following types of methods are provided via the Class::MakeMethods interface:

clone

Produce a deep copy of an instance of almost any underlying datatype.

Parameters:

init_method

If defined, this method is called on the new object with any arguments passed in.

prototype

Create new instances by making a deep copy of a static prototypical instance.

Parameters:

init_method

If defined, this method is called on the new object with any arguments passed in. =cut

sub prototype {
  ( {
    'interface' => {
      default => { '*'=>'set_or_new',  },
    },
    'behavior' => {
      'set_or_new' => sub { my $m_info = $_[0]; sub {         my $class = shift;

         if ( scalar @_ == 1 and UNIVERSAL::isa( $_[0], $class ) ) {
           # set
           $m_info->{'instance'} = shift
 
 
         } else {
           # get
           croak "Prototype is not defined" unless $m_info->{'instance'};
           my $self = ref_clone($m_info->{'instance'});
 
 
           my $init_method = $m_info->{'init_method'};
           if ( $init_method ) {
             $self->$init_method( @_ );
           } elsif ( scalar @_ ) {
             croak "No init_method";
           }
           return $self;
         }
       }},
       'set' => sub { my $m_info = $_[0]; sub {
         my $class = shift;
         $m_info->{'instance'} = shift 
       }},
       'new' => sub { my $m_info = $_[0]; sub {
         my $class = shift;
 
 
         croak "Prototype is not defined" unless $m_info->{'instance'};
         my $self = ref_clone($m_info->{'instance'});
 
 
         my $init_method = $m_info->{'init_method'};
         if ( $init_method ) {
           $self->$init_method( @_ );
         } elsif ( scalar @_ ) {
           croak "No init_method";
         }
         return $self;
       }},
     },
   } )
 }
 
 

######################################################################

compare

Compare one object to another.

Templates

default

Three-way (sorting-style) comparison.

equals

Are these two objects equivalent?

identity

Are these two references to the exact same object?

SEE ALSO

See Class::MakeMethods for general information about this distribution.

See Class::MakeMethods::Template for more about this family of subclasses.

See Class::MakeMethods::Utility::Ref for the clone and compare functions used above.