/usr/share/perl5/DBIx/Class/IntrospectableM2M.pm is in libdbix-class-introspectablem2m-perl 0.001001-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | package DBIx::Class::IntrospectableM2M;
use strict;
use warnings;
use base 'DBIx::Class';
our $VERSION = '0.001001';
#namespace pollution. sadface.
__PACKAGE__->mk_classdata( _m2m_metadata => {} );
sub many_to_many {
my $class = shift;
my ($meth_name, $link, $far_side) = @_;
my $store = $class->_m2m_metadata;
warn("You are overwritting another relationship's metadata")
if exists $store->{$meth_name};
my $attrs = {
accessor => $meth_name,
relation => $link, #"link" table or imediate relation
foreign_relation => $far_side, #'far' table or foreign relation
(@_ > 3 ? (attrs => $_[3]) : ()), #only store if exist
rs_method => "${meth_name}_rs", #for completeness..
add_method => "add_to_${meth_name}",
set_method => "set_${meth_name}",
remove_method => "remove_from_${meth_name}",
};
#inheritable data workaround
$class->_m2m_metadata({ $meth_name => $attrs, %$store});
$class->next::method(@_);
}
1;
__END__;
=head1 NAME
DBIx::Class::IntrospectableM2M - Introspect many-to-many shortcuts
=head1 SYNOPSIS
In your L<DBIx::Class> Result class
(sometimes erroneously referred to as the 'table' class):
__PACKAGE__->load_components(qw/IntrospectableM2M ... Core/);
#Digest encoder with hex format and SHA-1 algorithm
__PACKAGE__->many_to_many(roles => user_roles => 'role);
When you want to introspect this data
my $metadata = $result_class->_m2m_metadata->{roles};
# $metadata->{accessor} method name e.g. 'roles'
# $metadata->{relation} maping relation e.g. 'user_roles'
# $metadata->{foreign_relation} far-side relation e.g. 'role
# $metadata->{attrs} relationship attributes, if any
# Convenience methods created by DBIx::Class
# $metadata->{rs_method} 'roles_rs'
# $metadata->{add_method} 'add_to_roles',
# $metadata->{set_method} 'set_roles',
# $metadata->{remove_method} 'remove_from_roles'
B<Note:> The component needs to be loaded I<before> Core.
=head1 COMPATIBILITY NOTICE
This module is fairly esoteric and, unless you are dynamically creating
something out of of a DBIC Schema, is probably the wrong solution for
whatever it is you are trying to do. Please be advised that compatibility
is not guaranteed for DBIx::Class 0.09000+. We will try to mantain all
compatibility, but internal changes might make it impossible.
=head1 DESCRIPTION
Because the many-to-many relationships are not real relationships, they can not
be introspected with DBIx::Class. Many-to-many relationships are actually just
a collection of convenience methods installed to bridge two relationships.
This L<DBIx::Class> component can be used to store all relevant information
about these non-relationships so they can later be introspected and examined.
=head1 METHODS
=head2 many_to_many
Extended to store all relevant information in the C<_m2m_metadata> HASH ref.
=head2 _m2m_metadata
Accessor to a HASH ref where the keys are the names of m2m relationships and
the value is a HASH ref as described in the SYNOPSIS.
=head1 AUTHOR
Guillermo Roditi (groditi) E<lt>groditi@cpan.orgE<gt>
=head1 COPYRIGHT AND LICENSE
Copyright (C) 2008 by Guillermo Roditi
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
=cut
|