| Data-Domain-SemanticAdapter documentation | Contained in the Data-Domain-SemanticAdapter distribution. |
Data::Domain::SemanticAdapter - Adapter for Data::Semantic objects
version 1.100840
This class is an adapter (wrapper) that turns Data::Semantic objects into Data::Domain objects.
It, and therefore all the subclasses, support a -not_in options. If given,
the data must be different from all values in the exclusion set, supplied
as an arrayref.
Returns the corresponding semantic class name. This method provides a default mapping, the idea of which is to mirror the layout of the Data::Semantic class tree. If you have a different mapping, override this method in a subclass.
So in the Data::Domain::URI::http class, it will return
Data::Semantic::URI::http.
Takes the results of semantic_class_name() and semantic_args(), loads
the semantic data class and returns a semantic data object with the given args
passed to its constructor.
Turns the object's options, specified via OPTIONS(), into arguments to be
passed to the semantic data object's constructor. Returns a hash.
Inspects the data using the adaptee(). See Data::Domain for more
information. Respects the -not_in option and returns a EXCLUSION_SET
message, if appropriate. If the adaptee() says that the data is not valid
under the given options, an INVALID message is returned.
This is a convenience function (not method) that installs shortcuts into the
calling package. It expects a mapping hash whose keys are the shortcuts to be
created and whose values are the package names relative to Data::Domain::.
See Data::Domain, section Shortcut functions for domain constructors, for
more information on shortcuts.
Here is an example from Data::Domain::Net:
our %map = (
IPv4 => 'Net::IPAddress::IPv4',
IPv6 => 'Net::IPAddress::IPv6',
);
Data::Domain::SemanticAdapter::install_shortcuts(%map);
This installs two functions, IPv4() and IPv6(), into Data::Domain::Net.
Now code that wants to use network-based domain objects can just say:
use Data::Domain::Net ':all';
my $domain = IPv4(-not_in => [ ... ]);
$domain->inspect(...);
See perlmodinstall for information and options on installing Perl modules.
No bugs have been reported.
Please report any bugs or feature requests through the web interface at http://rt.cpan.org/Public/Dist/Display.html?Name=Data-Domain-SemanticAdapter.
The latest version of this module is available from the Comprehensive Perl Archive Network (CPAN). Visit http://www.perl.com/CPAN/ to find a CPAN site near you, or see http://search.cpan.org/dist/Data-Domain-SemanticAdapter/.
The development version lives at http://github.com/hanekomu/Data-Domain-SemanticAdapter/. Instead of sending patches, please fork this project using the standard git and github infrastructure.
Marcel Gruenauer <marcel@cpan.org>
This software is copyright (c) 2007 by Marcel Gruenauer.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.
| Data-Domain-SemanticAdapter documentation | Contained in the Data-Domain-SemanticAdapter distribution. |
use 5.008; use strict; use warnings; package Data::Domain::SemanticAdapter; our $VERSION = '1.100840'; # ABSTRACT: Adapter for Data::Semantic objects use Carp; use UNIVERSAL::require; use parent qw( Data::Domain Data::Inherited Class::Accessor::Complex ); __PACKAGE__->mk_scalar_accessors(qw(adaptee)); # sub adaptee() to be defined in subclasses use constant OPTIONS => (); sub new { my $class = shift; my $self = bless {}, $class; my @options = (qw/-not_in/, $self->every_list('OPTIONS')); my $parsed = Data::Domain::_parse_args(\@_, \@options); while (my ($key, $value) = each %{ $parsed || {} }) { $self->{$key} = $value; } if ($self->{-not_in}) { @{ $self->{-not_in} || [] } > 0 or croak "-not_in : needs an arrayref of values"; } my $semantic_class_name = $self->semantic_class_name; $semantic_class_name->require; $self->adaptee($semantic_class_name->new($self->semantic_args)); $self; } # Default; subclasses can redefine this. But it makes sense to keep the # Data::Domain::* and Data::Semantic::* namespaces in sync. sub semantic_class_name { my $self = shift; (my $semantic_class_name = ref $self) =~ s/^Data::Domain::/Data::Semantic::/; $semantic_class_name; } # Turn the options accepted because of OPTIONS() into args to be passed to the # adaptee constructor. Here we provide a sensibe default. sub semantic_args { my $self = shift; my %args; for my $option ($self->OPTIONS) { (my $semantic_key = $option) =~ s/^-//; $args{$semantic_key} = $self->{$option} if defined $self->{$option}; } %args; } sub _inspect { my ($self, $data) = @_; $self->adaptee->is_valid($data) or return $self->msg(INVALID => $data); if (defined $self->{-not_in}) { grep { $data eq $_ } @{ $self->{-not_in} } and return $self->msg(EXCLUSION_SET => $data); } } # mirror the Data::Semantic::Name namespace classes sub install_shortcuts { my %map = @_; my $call_pkg = (caller)[0]; while (my ($domain, $class) = each %map) { no strict 'refs'; my $domain_class_name = "Data::Domain::$class"; $domain_class_name->require; *{"${call_pkg}::${domain}"} = sub { $domain_class_name->new(@_) }; } } 1; __END__