package Xmldoom::Object::Property; use Scalar::Util qw(weaken); use strict; sub new { my $class = shift; my $args = shift; my $definition; my $object; if ( ref($args) eq 'HASH' ) { $definition = $args->{definition}; $object = $args->{object}; } else { $definition = $args; $object = shift; } my $self = { definition => $definition, object => $object, object_data => { }, }; if ( defined $self->{object} ) { weaken( $self->{object} ); } bless $self, $class; return $self; } sub get_definition { return shift->{definition}; } sub get_name { return shift->{definition}->get_name(); } sub get_type { return shift->{definition}->get_type(); } sub get_data_type { my $self = shift; my $args = shift; if ( ref($args) ne 'HASH' ) { $args = { }; } # we want to pass our object along, in case the property # options are dependent. $args->{object} = $self->{object}; return $self->{definition}->get_data_type($args); } sub get_options { my $self = shift; return $self->{definition}->get_options($self->{object}); } sub set { my $self = shift; my $args = shift; $self->{definition}->set( $self->{object}, $args, $self->{object_data} ); } sub get { my $self = shift; my $args = shift; return $self->{definition}->get( $self->{object}, $args, $self->{object_data} ); } sub get_hint { my ($self, $name) = @_; return $self->{definition}->get_hint( $name ); } sub get_pretty { my $self = shift; my $value = $self->{definition}->get( $self->{object}, $self->{object_data} ); my $desc = $self->{definition}->get_value_description( $value ); if ( defined $desc ) { $value = $desc; } return $value; } sub get_autoload_list { my $self = shift; return [ @{$self->{definition}->get_autoload_get_list()}, @{$self->{definition}->get_autoload_set_list()} ]; } sub autoload { my ($self, $func_name, $arg) = (shift, shift, shift); return $self->{definition}->autoload( $self->{object}, $func_name, $arg, $self->{object_data} ); } 1;