use strict; package Salvation::MacroProcessor::Connector; use Moose; use MooseX::StrictConstructor; use Carp::Assert 'assert'; use Scalar::Util 'blessed'; has 'name' => ( is => 'ro', isa => 'Str', required => 1 ); has 'associated_meta' => ( is => 'ro', isa => 'Class::MOP::Module', required => 1, weak_ref => 1 ); has 'code' => ( is => 'ro', isa => 'CodeRef', required => 1 ); has 'previously_associated_meta' => ( is => 'ro', isa => 'Class::MOP::Module', weak_ref => 1, predicate => 'has_previously_associated_meta' ); has '__required_shares' => ( is => 'ro', isa => 'ArrayRef[Str]', predicate => 'has_required_shares', init_arg => 'required_shares' ); has 'inherited_connector' => ( is => 'ro', isa => sprintf( 'Maybe[%s]', __PACKAGE__ ), lazy => 1, builder => '__build_inherited_connector', init_arg => undef, clearer => '__clear_inherited_connector' ); sub clone { my ( $self, %overrides ) = @_; my $clone = $self -> meta() -> clone_object( $self, %overrides ); $clone -> __clear_inherited_connector() if exists $overrides{ 'previously_associated_meta' }; return $clone; } sub __build_inherited_connector { my $self = shift; if( $self -> has_previously_associated_meta() ) { return $self -> previously_associated_meta() -> smp_find_connector_by_name( $self -> name() ); } return undef; } sub required_shares { my $self = shift; my @shares = (); # if( my $id = $self -> inherited_connector() ) # { # push @shares, @{ $id -> required_shares() }; # } if( $self -> has_required_shares() ) { push @shares, @{ $self -> __required_shares() }; } return \@shares; } __PACKAGE__ -> meta() -> make_immutable(); no MooseX::StrictConstructor; no Moose; -1; __END__ # ABSTRACT: An object representing interconnection between two classes =pod =head1 NAME Salvation::MacroProcessor::Connector - An object representing interconnection between two classes =head1 REQUIRES L L L L =head1 METHODS =head2 new Salvation::MacroProcessor::Connector -> new( name => $name, code => $code, associated_meta => $associated_meta, previously_associated_meta => $previously_associated_meta, required_shares => $required_shares ) C, C and C are required arguments. Constructor. Returns L instance. All arguments documented at this section below, or at C function documentation of L module. =head2 name $object -> name(); Returns string which is the name of this connector. =head2 code $object -> code(); Returns CodeRef which is the actual connecting code. =head2 associated_meta $object -> associated_meta(); Returns L or L object instance corresponding to the object which has defined the connector. =head2 previously_associated_meta $object -> previously_associated_meta(); Returns L or L object instance corresponding to the object which has defined the connector. It is used when child class inherits a connector from its parent and holds the reference to parent's class metaclass. =head2 inherited_connector $description -> inherited_connector(); Returns L object instance as it has been defined by a parent class if the connector has been inherited. =head2 clone $object -> clone(); Clones connector, returning new-made clone. =head2 required_shares $object -> required_shares(); Returns an ArrayRef. Each element is the name of required share. =cut