#!/usr/bin/perl use strict; use warnings; package Zvire; use Class::InsideOut qw/:all/; # atributy readonly jmeno => my %jmena; package Zvire::Kocka; use Class::InsideOut qw/:all/; use base qw/Zvire/; # nic navic oproti tride Zvire package Zvire::Pes; use Class::InsideOut qw/:std/; use Carp qw/croak/; use base qw/Zvire/; sub _check_kocka { my $kocka = shift; # parametr musi byt undef a nebo objekt tridy Zvire::Kocka return if not defined $kocka; unless ($kocka->isa('Zvire::Kocka')) { die "ocekaval se objekt Zvire::Kocka\n"; } } public kocka => my %kocky, { # pri zmene atributu je provedena jeho kontrola set_hook => sub { _check_kocka($_); } }; # inicializace s kontrolou sub new { my $self = Class::InsideOut::new(@_); eval { # zde je mozno provest nekolik kontrol _check_kocka($kocky{id $self}); }; croak $@ if $@; return $self; } sub pronasleduj { my $self = shift; print $self->jmeno() , defined $self->kocka() ? ' pronasleduje kocku/kocoura jmenem ' . $self->kocka->jmeno() : ' nepronasleduje nikoho' , ".\n"; } package main; my $tom = Zvire::Kocka->new(jmeno => 'Tom'); my $spike = Zvire::Pes->new(jmeno => 'Spike', kocka => $tom); $spike->pronasleduj(); $spike->kocka(undef); $spike->pronasleduj();