<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2russianfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Go!Verla Flex блог</title>
	
	<link>http://tearaway-tea.com/blog</link>
	<description>от Евгения Тютюнника</description>
	<lastBuildDate>Mon, 31 Aug 2009 04:21:11 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>ru</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/goverlaflexblog" type="application/rss+xml" /><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fgoverlaflexblog" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fgoverlaflexblog" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Fgoverlaflexblog" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/goverlaflexblog" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fgoverlaflexblog" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fgoverlaflexblog" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fgoverlaflexblog" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://lenta.yandex.ru/settings.xml?name=feed&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fgoverlaflexblog" src="http://lenta.yandex.ru/i/addfeed.gif">?????? ? ??????.?????</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2Fgoverlaflexblog" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2Fgoverlaflexblog" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2Fgoverlaflexblog" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsalloy.com/?rss=http%3A%2F%2Ffeeds.feedburner.com%2Fgoverlaflexblog" src="http://www.newsalloy.com/subrss3.gif">Subscribe with NewsAlloy</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2Fgoverlaflexblog" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fgoverlaflexblog" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://www.yourminis.com/subscribe.aspx?u=http%3A%2F%2Ffeeds.feedburner.com%2Fgoverlaflexblog" src="http://www.yourminis.com/images/addtoyourminisbadge.gif">Subscribe with Yourminis.com</feedburner:feedFlare><feedburner:feedFlare href="http://download.attensa.com/app/get_attensa.html?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fgoverlaflexblog" src="http://www.attensa.com/blogs/attensa/WindowsLiveWriter/BadgeredintoBadges_10C02/attensa_feed_button5.gif">Subscribe with Attensa for Outlook</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fgoverlaflexblog" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://hub.netomat.net/account/account.autoSubscribe.jspa?urls=http%3A%2F%2Ffeeds.feedburner.com%2Fgoverlaflexblog" src="http://www.netomat.net/blogger/images/icon_netomat_feedbutton.gif">Subscribe with netomat Hub</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fgoverlaflexblog" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.flurry.com/pushRssFeed.do?r=fb&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fgoverlaflexblog" src="http://www.flurry.com/images/flurry_rss_logo2.gif">Subscribe with Flurry</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2Fgoverlaflexblog" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2Fgoverlaflexblog" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Вращение блудного сильверлайтера</title>
		<link>http://feedproxy.google.com/~r/goverlaflexblog/~3/npdvwwmqW4w/</link>
		<comments>http://tearaway-tea.com/blog/2009/08/%d0%b2%d1%80%d0%b0%d1%89%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b1%d0%bb%d1%83%d0%b4%d0%bd%d0%be%d0%b3%d0%be-%d1%81%d0%b8%d0%bb%d1%8c%d0%b2%d0%b5%d1%80%d0%bb%d0%b0%d0%b9%d1%82%d0%b5%d1%80%d0%b0/ru/#comments</comments>
		<pubDate>Mon, 31 Aug 2009 03:55:29 +0000</pubDate>
		<dc:creator>tearaway_Tea</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://tearaway-tea.com/blog/?p=334</guid>
		<description><![CDATA[Привет ребята, пишу вам из далёкой Калифорнии, куда забросила судьба меня и мою жену. Так получилось, что я, очень резко, из флексера-страдальца превратился в счастливого сильверлайтера. Все мои коллеги уже успели получить от меня тонны положительных отзывов о данной технологии. Мой энтузиазм в описании всех фичей Silverlight и до сих пор не угасает. Правда, у [...]]]></description>
			<content:encoded><![CDATA[<p>Привет ребята, пишу вам из далёкой Калифорнии, куда забросила судьба меня и мою жену. Так получилось, что я, очень резко, из флексера-страдальца превратился в счастливого сильверлайтера. Все мои коллеги уже успели получить от меня тонны положительных отзывов о данной технологии. Мой энтузиазм в описании всех фичей Silverlight и до сих пор не угасает. Правда, у меня возникла диллема: мой блог был расчитан на аудиторию флексеров, и это было бы опрометчиво, просто изменить тематику статей — поэтому так долго и не писал.</p>
<p><span id="more-334"></span><br />
В Silverlight все отлично, начиная от возможности писать код на всех языках из семьи .NET (ну, конечно же, самый популярный это красавец С#), заканчивая продуманной иерархией визуальных компонентов и возможности их полного видоизменения. Двусторонний биндинг, LINQ, нормальная поддержка ООП, Expression Blend как средство, прошу заметить, удобного «design mode» и т.п.</p>
<p>Есть и некоторые проблемные места, которые во Flex работают из коробки, например невозможность использовать свои курсоры, отсутствие чего-то на подобии PopUpManager, и нативного drag-n-drop. Но это все делается довольно быстро вручную.</p>
<p>В общем, я бы уже и смирился бы с мыслью, что Flex удел мучеников и желающих и далее подставлять костыли в индуский вонючий код, как был просто повержен беглым анализом новых фичей беты Flex 4!</p>
<p>Это был катарсис, оказывается в Adobe не все заснули в двухлетнюю спячку, оказывается они поняли, что раз Microsoft, возможно и своровали идею MXML, binding и вообще флекса как технологии (отмывши это все от толстого слоя ила из берегов Ганга), им ничего не мешает сделать то же самое. И вот, пожалуйста, новый фреймворк визуальных компонентов Spark, который один к одному копирует подход Template Design-а в архитектуре контролов Silverlight, это подробнее обсудим в следующих статьях. Вот тебе и пока-что хромающий Flash Catalyst, идеологическое подобие Expression Blend, вот тебе и новый язык векторной разметки на основе MXML — FXG!, точная копия набора примитивов из XAML (Rect, Ellipse, GradientFill и т.п.). Без которого немыслимо то самое разделение труда дизайнера и программиста.</p>
<p>Мало того, после просмотра исходного кода спарковских контролов, у меня возникло впечатление, что его писали уже люди, а не человеко-недели. Это же можно читать! Подозреваю, что Adobe всё-таки наняла нормальных архитекторов и программистов из штатов. Что конечно достойно глубокого поклона с моей стороны.</p>
<p>В общем, я несказанно счастлив, что теперь есть в чём разбиратся дальше. И что, возможно, вернусь в лоно флекса, как тот самый библейский блудный сын. Конечно же, как говорится, что-бы победить нужно узнать все слабости врага, чем, можно сказать, я сейчас и занимаюсь. Пожалуй в этом контексте и попробую написать несколько статей, не просто сравнивая Silverlight и Flex (слава Богу, сейчас это уже возможно), а рассматривая конкретные подходы в проектировании приложений, которые можно применять на обеих платформах. До встречи, друзья.</p>
<img src="http://feeds.feedburner.com/~r/goverlaflexblog/~4/npdvwwmqW4w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tearaway-tea.com/blog/2009/08/%d0%b2%d1%80%d0%b0%d1%89%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b1%d0%bb%d1%83%d0%b4%d0%bd%d0%be%d0%b3%d0%be-%d1%81%d0%b8%d0%bb%d1%8c%d0%b2%d0%b5%d1%80%d0%bb%d0%b0%d0%b9%d1%82%d0%b5%d1%80%d0%b0/ru/feed/ru/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://tearaway-tea.com/blog/2009/08/%d0%b2%d1%80%d0%b0%d1%89%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b1%d0%bb%d1%83%d0%b4%d0%bd%d0%be%d0%b3%d0%be-%d1%81%d0%b8%d0%bb%d1%8c%d0%b2%d0%b5%d1%80%d0%bb%d0%b0%d0%b9%d1%82%d0%b5%d1%80%d0%b0/ru/</feedburner:origLink></item>
		<item>
		<title>Яков Файн в Киеве. Комментарии к его докладу о RIA</title>
		<link>http://feedproxy.google.com/~r/goverlaflexblog/~3/pDeACJOi50U/</link>
		<comments>http://tearaway-tea.com/blog/2009/05/%d1%8f%d0%ba%d0%be%d0%b2-%d1%84%d0%b0%d0%b9%d0%bd-%d0%b2-%d0%ba%d0%b8%d0%b5%d0%b2%d0%b5-%d0%ba%d0%be%d0%bc%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d1%80%d0%b8%d0%b8/ru/#comments</comments>
		<pubDate>Tue, 05 May 2009 12:58:55 +0000</pubDate>
		<dc:creator>tearaway_Tea</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://tearaway-tea.com/blog/?p=321</guid>
		<description><![CDATA[Яков — киевлянин, уехал в США около 15 лет назад. Свой доклад он определил как благотворительный подарок программистам родного города. Мероприятие состоялось в киевском офисе компании Microsoft. Во-первых, офис у них великолепный: большие пространства, оригинальная мебель, в общем, всё навысоте — мощь и деньги на лицо. Во-вторых, сам Яков жавист и флексер, директор компании Farata [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-324" title="Yakov Fain" src="http://tearaway-tea.com/blog/wp-content/uploads/2009/05/yakov_fain.jpg" alt="Yakov Fain" width="160" height="160" />Яков — киевлянин, уехал в США около 15 лет назад. Свой доклад он определил как благотворительный подарок программистам родного города. Мероприятие состоялось в киевском офисе компании Microsoft. Во-первых, офис у них великолепный: большие пространства, оригинальная мебель, в общем, всё навысоте — мощь и деньги на лицо. Во-вторых, сам Яков жавист и флексер, директор компании <a href="http://www.faratasystems.com/">Farata Systems</a>, во время доклада не раз упрекал Microsoft в известных грехах, что придавало докладу очаровательную ироничность.</p>
<p><span id="more-321"></span> Содержание выступления, лично для меня, не несло новую информацию, скорее это был скомпилированый экскурс по текущим RIA технологиям: AJAX, Flex, Silverlight, JavaFX, чем практичный тренинг. Но, тем не менее, рассказ был очень интересным. Яков —  отличный докладчик. На докладе прозвучали всякие закулисные сплетни, которые обычно не публикуются в блогах или новостях. Например, почему разработчики Adobe AIR не добавляют в свой продукт расширенный доступ к ОС и т.п.</p>
<p>Основные полезные, на мой взгляд, тезисы:</p>
<ul>
<li>Silverlight уже догнал Flex в технологическом контексте, осталось только повысить колличество инсталяций плагина у пользователей;</li>
<li>Яков против всех сторонних фреймворков для Flex, он считает что Flex вполне самодостаточный фреймворк и не стоит его утяжелять дополнительными абстракциями. Я с этим, конечно же, не согласен — это вообще странное заявление. Наводит на мысль о том, что в основном Farata  Systems разрабатывает проекты ориентированые на визуальное представление, а не на сложную бизнес-функциональность;</li>
<li>Если вы сталкиваетесь с ошибками Flex фреймворка (а это неизбежно), вы должны наследовать и исправлять, если не получается наследовать — copy-paste. Яков мотивирует это тем, что в каждой новой версии Flex всё равно перепишут до неузнаваемости, по-этому не стоит тратить время на «изящные фиксы»;</li>
<li>Не нужно ждать исправления «знаменитых багов». Чинить нужно самому. Яков, пояснил, что большие компании имеют собственное видение своих продуктов, которое не всегда пересекается с интересами вашего проекта, по-этому хорошая практика предполагает ориентацию на починку своих проблем собственноручно.</li>
</ul>
<p>Вообще, Яков довольно прагматичный человек, все суждения которого воспринимаются хоть и неожидано, но без особых внутренних возражений. Возможно это из-за того, что я не менее прагматичен чем он?.. В заключении своего выступления, он рассказал о двух самых главных проблемах программистов из СНГ:</p>
<ul>
<li>Плохое знание английского языка;</li>
<li>Завышеное самомнение, которое сопряжено с конкретными проблемами в разработке. Яков утверждает, что при работе с нашими ребятами он не раз напарывался на неприятный факт уверенности их в том, что они лучше знают что нужно заказчику, чем сам заказчик.</li>
</ul>
<p>И, что-бы поддержать свой внутренний прагматичный уровень, я не могу не согласиться с данными заявлениями, так как сам являюсь живым примером подобных тенденций — нужно работать над собой.</p>
<p>Доклад удался. Слава Богу, что Microsoft искупает свои грехи подобными бесплатными мероприятиями, а так же бесплатным печеньем и кофе.</p>
<img src="http://feeds.feedburner.com/~r/goverlaflexblog/~4/pDeACJOi50U" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tearaway-tea.com/blog/2009/05/%d1%8f%d0%ba%d0%be%d0%b2-%d1%84%d0%b0%d0%b9%d0%bd-%d0%b2-%d0%ba%d0%b8%d0%b5%d0%b2%d0%b5-%d0%ba%d0%be%d0%bc%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d1%80%d0%b8%d0%b8/ru/feed/ru/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		<feedburner:origLink>http://tearaway-tea.com/blog/2009/05/%d1%8f%d0%ba%d0%be%d0%b2-%d1%84%d0%b0%d0%b9%d0%bd-%d0%b2-%d0%ba%d0%b8%d0%b5%d0%b2%d0%b5-%d0%ba%d0%be%d0%bc%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d1%80%d0%b8%d0%b8/ru/</feedburner:origLink></item>
		<item>
		<title>Инвалидация свойств невизуальных объектов</title>
		<link>http://feedproxy.google.com/~r/goverlaflexblog/~3/fNmLot1zuWE/</link>
		<comments>http://tearaway-tea.com/blog/2009/04/%d0%b8%d0%bd%d0%b2%d0%b0%d0%bb%d0%b8%d0%b4%d0%b0%d1%86%d0%b8%d1%8f-%d1%81%d0%b2%d0%be%d0%b9%d1%81%d1%82%d0%b2-%d0%bd%d0%b5%d0%b2%d0%b8%d0%b7%d1%83%d0%b0%d0%bb%d1%8c%d0%bd%d1%8b%d1%85-%d0%be%d0%b1/ru/#comments</comments>
		<pubDate>Thu, 16 Apr 2009 14:58:47 +0000</pubDate>
		<dc:creator>tearaway_Tea</dc:creator>
				<category><![CDATA[Action Script]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://tearaway-tea.com/blog/?p=311</guid>
		<description><![CDATA[Наверно, следовало бы сначала описать своё понимание паттерна «Инвалидация чего-либо» во Flex. Может быть напишу статью о полезности такого подхода в разработке визуальных компонентов. В общем, возможно, вы часто используете пару методов invalidateProperties() / commitProperties() для отложеного выполнения логики set методов свойств ваших компонентов. Эта пара определена в базовом для всех Flex контролов классе UIComponent.
Краткий [...]]]></description>
			<content:encoded><![CDATA[<p>Наверно, следовало бы сначала описать своё понимание паттерна «Инвалидация чего-либо» во Flex. Может быть напишу статью о полезности такого подхода в разработке визуальных компонентов. В общем, возможно, вы часто используете пару методов <em>invalidateProperties()</em> / <em>commitProperties()</em> для отложеного выполнения логики set методов свойств ваших компонентов. Эта пара определена в базовом для всех Flex контролов классе UIComponent.</p>
<p>Краткий смысл паттерна в том, что мы ожидаем присваивание значений набору свойств компонента в течение одного кадра Flash Player-а, а последующюю логику обработки этих значений переносим на следующий кадр. Это может повысить производительность приложения, а так же навести порядок в обработке значений связанных между собой свойств компонента.</p>
<p>Полагаю, что инвалидация свойств компонентов во Flex практикуется потому, что большинство компонентов инстанциируется посредством MXML и порядок присваивания свойств спрогнозировать невозможно.</p>
<p>Но, на практике, возникаются ситуации, когда подобный механизм нужен и в невизуальных объектах, например элементах модели бизнес-логики, которые приходят от сервера.</p>
<p><span id="more-311"></span><br />
Я подготовил простой <a title="Properties Invalidation" href="http://tearaway-tea.googlecode.com/svn/trunk/propertiesInvalidation/index.html">пример</a>, который демонстрирует суть задачи.</p>
<p>Допустим у нас есть класс модели <a title="OpportunityDTO" href="http://code.google.com/p/tearaway-tea/source/browse/trunk/propertiesInvalidation/src/com/tearaway_tea/model/OpportunityDTO.as">OpportunityDTO</a>, экземпляры которого получаются от сервера и создаются AMF десериализатором Flash Player-а, который нам не подконтролен. В нём есть два свойства <em>date</em>, <em>children</em>, в момент присваивания значений которых, нам нужна дополнительная обработка. Эта обработка должна выполняться только тогда, когда оба свойства получили свои значения. Типичный случай для паттерна инвалидации свойств.</p>
<pre><code>package com.tearaway_tea.model
{
	import flash.events.EventDispatcher;

	import mx.collections.ArrayCollection;

	import org.goverla.interfaces.IPropertiesInvalidable;
	import org.goverla.managers.PropertiesInvalidationManager;

	public class OpportunityDTO extends EventDispatcher implements IPropertiesInvalidable
	{
		public function get date() : Date
		{
			return _date;
		}

		public function set date(value : Date) : void
		{
			_date = value;
			_dateChanged = true;
			invalidateProperties();
		}

		public function get children() : ArrayCollection
		{
			return _children;
		}

		public function set children(value : ArrayCollection) : void
		{
			_children = value;
			_childrenChanged = true;
			invalidateProperties();
		}

		public function invalidateProperties() : void
		{
			PropertiesInvalidationManager.instance.invalidateProperties(this);
		}

		public function commitProperties() : void
		{
			if (_dateChanged &amp;&amp; _childrenChanged)
			{
				_dateChanged = false;
				_childrenChanged = false;

				for each (var item : ItemDTO in children)
				{
					item.name += "/" + date.toString();
				}
			}
		}

		private var _date : Date;

		private var _dateChanged : Boolean;

		private var _children : ArrayCollection;

		private var _childrenChanged : Boolean;
	}
}</code></pre>
<p>Для решения этой задачи я предлагаю использовать синглтон <a title="PropertiesInvalidationManager" href="http://code.google.com/p/goverla/source/browse/trunk/goverla/src/org/goverla/managers/PropertiesInvalidationManager.as">PropertiesInvalidationManager</a>, который работает по образу и подобию флексовского LayoutManager-а.</p>
<pre><code>package org.goverla.managers
{
	import mx.rpc.AsyncDispatcher;

	import org.goverla.interfaces.IPropertiesInvalidable;

	public class PropertiesInvalidationManager
	{
		public static function get instance() : PropertiesInvalidationManager
		{
			if (_instance == null)
			{
				_instance = new PropertiesInvalidationManager();
			}
			return _instance;
		}

		private static var _instance : PropertiesInvalidationManager;

		public function invalidateProperties(target : IPropertiesInvalidable) : void
		{
			if (_targets.indexOf(target) &lt; 0)
			{
				_targets.push(target);

				if (_dispatcher == null)
				{
					_dispatcher =
						new AsyncDispatcher(commitProperties, [], 0);
				}
			}
		}

		public function commitProperties() : void
		{
			for each (var target : IPropertiesInvalidable in _targets)
			{
				target.commitProperties();
			}
			_targets = [];
			_dispatcher = null;
		}

		private var _targets : Array = [];

		private var _dispatcher : AsyncDispatcher;

	}
}</code></pre>
<p>Суть очевидна. Менеджер получает ссылку на объект, который нуждается в инвалидации свойств, ставит его в очередь и на следующем кадре вызывает у него <em>commitProperties()</em>. Для откладывания выполнения используется флексовский AsyncDispatcher, который основан на Timer.</p>
<p>Для удобства использования, можна создать какой-то базовый класс, который будет имплементировать интерфейс IPropertiesInvalidable.</p>
<img src="http://feeds.feedburner.com/~r/goverlaflexblog/~4/fNmLot1zuWE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tearaway-tea.com/blog/2009/04/%d0%b8%d0%bd%d0%b2%d0%b0%d0%bb%d0%b8%d0%b4%d0%b0%d1%86%d0%b8%d1%8f-%d1%81%d0%b2%d0%be%d0%b9%d1%81%d1%82%d0%b2-%d0%bd%d0%b5%d0%b2%d0%b8%d0%b7%d1%83%d0%b0%d0%bb%d1%8c%d0%bd%d1%8b%d1%85-%d0%be%d0%b1/ru/feed/ru/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		<feedburner:origLink>http://tearaway-tea.com/blog/2009/04/%d0%b8%d0%bd%d0%b2%d0%b0%d0%bb%d0%b8%d0%b4%d0%b0%d1%86%d0%b8%d1%8f-%d1%81%d0%b2%d0%be%d0%b9%d1%81%d1%82%d0%b2-%d0%bd%d0%b5%d0%b2%d0%b8%d0%b7%d1%83%d0%b0%d0%bb%d1%8c%d0%bd%d1%8b%d1%85-%d0%be%d0%b1/ru/</feedburner:origLink></item>
		<item>
		<title>Моя презентация с iForum 2009</title>
		<link>http://feedproxy.google.com/~r/goverlaflexblog/~3/_bubCzPUtbI/</link>
		<comments>http://tearaway-tea.com/blog/2009/04/%d0%bc%d0%be%d1%8f-%d0%bf%d1%80%d0%b5%d0%b7%d0%b5%d0%bd%d1%82%d0%b0%d1%86%d0%b8%d1%8f-%d1%81-iforum-2009/ru/#comments</comments>
		<pubDate>Thu, 02 Apr 2009 14:42:28 +0000</pubDate>
		<dc:creator>tearaway_Tea</dc:creator>
				<category><![CDATA[AIR]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://tearaway-tea.com/blog/?p=274</guid>
		<description><![CDATA[Согласно сообщению от организаторов, форум посетило около 1200 человек. Большинство из них мало интересовалось потоком «Интернет-Технологии», что логично, так как в основном аудитория состояла из специалистов по рекламе, владельцев украинских интернет компаний, а также людей, мечтающих о владении подобными и прочих «интернет-дельцов».
Но, несмотря на немногочисленную аудиторию, я с удовольствием посмотрел и послушал выступление создателя библиотеки [...]]]></description>
			<content:encoded><![CDATA[<p>Согласно сообщению от организаторов, форум посетило около 1200 человек. Большинство из них мало интересовалось потоком <a title="«Интернет-Технологии»" href="http://iforum.com.ua/programma-tech/">«Интернет-Технологии»</a>, что логично, так как в основном аудитория состояла из специалистов по рекламе, владельцев украинских интернет компаний, а также людей, мечтающих о владении подобными и прочих «интернет-дельцов».</p>
<p>Но, несмотря на немногочисленную аудиторию, я с удовольствием посмотрел и послушал выступление создателя библиотеки <a title="Away3D" href="http://away3d.com/">Away3D</a>, Александра Задорожного, как часть доклада «Трёхмерные вебсайты и вебсервисы: возможности, преимущества и перспективы». Он, довольно грустно поведал о разочаровании последней версией Flash Player 10 на предмет отсутствия ожидаемой полной поддержки 3D, а не только базового функционала. Сказал, что забросил своё детище, хотя и удивлён тем, что, проект Away3D так долго существует (связывает это с низкой функциональностю API Flash Player-а).</p>
<p>Мою презентацию можно прокликать <a title="To Flex or Not To Flex" href="http://www.slideshare.net/tearaway_Tea/to-flex-or-not-to-flex">он-лайн</a>. Вроде бы будет и видео с выступления (но как часто бывает, после окончаний конференций уже некогда и незачем подобным заниматься).</p>
<div id="__ss_1238619" style="width: 500px; text-align: left;"><object width="500" height="417" data="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=iforum2009-flexair-090402074243-phpapp01&amp;rel=0&amp;stripped_title=to-flex-or-not-to-flex" type="application/x-shockwave-flash"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=iforum2009-flexair-090402074243-phpapp01&amp;rel=0&amp;stripped_title=to-flex-or-not-to-flex" /><param name="allowfullscreen" value="true" /></object></div>
<p>По уже сложившейся «традиции», после моего выступления Сергей Байдачный из Microsoft рассказал о Silverlight. На этот раз о новых фичах третьей беты. Вообще, мне очень интересна тема разработки на Silverlight (думаю, как и большинству сознательных флексеров). Flex до сих пор сложно назвать самым крутым средством для RIA, ввиду забивания со стороны Adobe на большинство вопросов программистского характера (рефакторинг, логичной и управляемой снаружи ООП моделью базовых компонентов, возможности языка Action Script). Так как Silverlight является наследником крутейших средств и методологий .NET-а, то он априори — крут, крут, крут.</p>
<img src="http://feeds.feedburner.com/~r/goverlaflexblog/~4/_bubCzPUtbI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tearaway-tea.com/blog/2009/04/%d0%bc%d0%be%d1%8f-%d0%bf%d1%80%d0%b5%d0%b7%d0%b5%d0%bd%d1%82%d0%b0%d1%86%d0%b8%d1%8f-%d1%81-iforum-2009/ru/feed/ru/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		<feedburner:origLink>http://tearaway-tea.com/blog/2009/04/%d0%bc%d0%be%d1%8f-%d0%bf%d1%80%d0%b5%d0%b7%d0%b5%d0%bd%d1%82%d0%b0%d1%86%d0%b8%d1%8f-%d1%81-iforum-2009/ru/</feedburner:origLink></item>
		<item>
		<title>Украинский форум интернет деятелей</title>
		<link>http://feedproxy.google.com/~r/goverlaflexblog/~3/iPx_WnEwqsQ/</link>
		<comments>http://tearaway-tea.com/blog/2009/03/%d1%83%d0%ba%d1%80%d0%b0%d0%b8%d0%bd%d1%81%d0%ba%d0%b8%d0%b9-%d1%84%d0%be%d1%80%d1%83%d0%bc-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d0%bd%d0%b5%d1%82-%d0%b4%d0%b5%d1%8f%d1%82%d0%b5%d0%bb%d0%b5%d0%b9/ru/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 11:29:51 +0000</pubDate>
		<dc:creator>tearaway_Tea</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://tearaway-tea.com/blog/?p=267</guid>
		<description><![CDATA[Завтра, первого апреля, я буду выступать с докладом о Flex и Adobe Air (такое вот дежавю, прошлой весной тоже докладывал об этом) на коференции, которую организовуют Алексей Мась и его сотрудники. Сайт конференции — http://iforum.com.ua/.
Мой доклад будет обзорным и риторическим. Предыдущий опыт подсказывает, что технические детали обычно скучны, нужно что-то визуальное и легко воспринимаемое. Например, почему [...]]]></description>
			<content:encoded><![CDATA[<p>Завтра, первого апреля, я буду выступать с докладом о Flex и Adobe Air (такое вот дежавю, прошлой весной тоже <a title="UA WEB 2008" href="http://tearaway-tea.com/blog/2008/03/моя-презентация-с-ua-web-2008/ru/">докладывал</a> об этом) на коференции, которую организовуют Алексей Мась и его сотрудники. Сайт конференции — <a title="Украинский форум интернет деятелей" href="http://iforum.com.ua/">http://iforum.com.ua/</a>.</p>
<p>Мой доклад будет обзорным и риторическим. Предыдущий опыт подсказывает, что технические детали обычно скучны, нужно что-то визуальное и легко воспринимаемое. Например, почему в большинстве случаев не нужно писать на Flex (я уже пытался раскрыть эту тему <a title="To Flex or Not To Flex" href="http://tearaway-tea.com/blog/2008/09/to-flex-or-not-to-flex/ru/">ранее</a>). Расскажу об основных недостатках и некоторых достоинствах, о том, что поменялось за последние 3 года существования Flex.</p>
<p>Программа потока Интернет-технологии — <a title="Поток ИНТЕРНЕТ-ТЕХНОЛОГИИ" href="http://iforum.com.ua/programma-tech/">http://iforum.com.ua/programma-tech/</a>.</p>
<p>P.S. Кстати нашёлся животрепещущий экземпляр сомнительного применения технологий Flash и Flex, ввиде движка <a title="Fuzzle CMS" href="http://fuzzle-cms.ru/app/">Fuzlle CMS</a> (слоган — «Подвигай!»). После <a title="Fuzzle — CMS для управления Flash-сайтами" href="http://habrahabr.ru/blogs/i_am_advertising/55487/">оригинальной статьи</a> на Хабре с призывом покупать лицензии и всё такое, я заинтересовался, что же это за феноменальная разбработка. Представте, админка, написанная на Flex, в которой можно создавать динамические сайты-визитки на флеше, интегрируя дизайн за 5 минут используя при этом привлекательную анимацию. Заманчиво, не так ли?</p>
<p><span id="more-267"></span><br />
А вот и результат (<a href="http://sekistov.ru/app/">http://sekistov.ru/app/</a>):</p>
<p><a href="http://sekistov.ru/app/"><img class="alignnone size-full wp-image-268" title="sekistov.ru" src="http://tearaway-tea.com/blog/wp-content/uploads/2009/03/sekistov.jpg" alt="sekistov.ru" width="500" height="268" /></a></p>
<p>Пожалуй, это даже грандиознее чем top4top.</p>
<img src="http://feeds.feedburner.com/~r/goverlaflexblog/~4/iPx_WnEwqsQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tearaway-tea.com/blog/2009/03/%d1%83%d0%ba%d1%80%d0%b0%d0%b8%d0%bd%d1%81%d0%ba%d0%b8%d0%b9-%d1%84%d0%be%d1%80%d1%83%d0%bc-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d0%bd%d0%b5%d1%82-%d0%b4%d0%b5%d1%8f%d1%82%d0%b5%d0%bb%d0%b5%d0%b9/ru/feed/ru/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://tearaway-tea.com/blog/2009/03/%d1%83%d0%ba%d1%80%d0%b0%d0%b8%d0%bd%d1%81%d0%ba%d0%b8%d0%b9-%d1%84%d0%be%d1%80%d1%83%d0%bc-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d0%bd%d0%b5%d1%82-%d0%b4%d0%b5%d1%8f%d1%82%d0%b5%d0%bb%d0%b5%d0%b9/ru/</feedburner:origLink></item>
		<item>
		<title>Пример использования Mate Flex Framework</title>
		<link>http://feedproxy.google.com/~r/goverlaflexblog/~3/AsnxEuxoo_I/</link>
		<comments>http://tearaway-tea.com/blog/2009/03/usage-example-of-mate-flex-framework/ru/#comments</comments>
		<pubDate>Tue, 24 Mar 2009 21:45:04 +0000</pubDate>
		<dc:creator>tearaway_Tea</dc:creator>
				<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://tearaway-tea.com/blog/?p=183</guid>
		<description><![CDATA[Сразу же после появления на свет вышеуказанного фреймворка я описал своё первое впечатление о нём. В нашем большом приложении корпоративного уровня мы его успешно используем и по сей день.
Некоторые коллеги постоянно норовят разузнать все детали и нюансы использования Mate на практике и в связи с этим я решил описать пример типового архитектурного решения основанного на [...]]]></description>
			<content:encoded><![CDATA[<p>Сразу же после появления на свет вышеуказанного фреймворка я <a href="http://tearaway-tea.com/blog/2008/09/5-копеек-о-mate-flex-framework/">описал</a> своё первое впечатление о нём. В нашем большом приложении корпоративного уровня мы его успешно используем и по сей день.</p>
<p>Некоторые коллеги постоянно норовят разузнать все детали и нюансы использования <em><a title="Mate Flex Framework" href="http://mate.asfusion.com/">Mate</a></em> на практике и в связи с этим я решил описать пример типового архитектурного решения основанного на модели реального приложения. Он похож на примеры с сайта фреймворка, но расписан пошагово с конкретными рекомендациями на всех уровнях.</p>
<p><span id="more-183"></span>Итак, я подготовил <a href="http://code.google.com/p/tearaway-tea/">проект</a> <strong><em>opportunities</em></strong> (так сказать, подающий большие надежды) на <em>Google Code</em> с доступными <a href="http://code.google.com/p/tearaway-tea/source/browse/#svn/trunk/opportunities">исходниками</a>. Для начала рассмотрим его <a href="http://tearaway-tea.googlecode.com/svn/trunk/opportunities/index.html">он-лайн</a>:</p>
<p><a href="http://tearaway-tea.googlecode.com/svn/trunk/opportunities/index.html"><img class="alignnone" title="Opportunities" src="http://tearaway-tea.googlecode.com/svn/trunk/opportunities/images/opportunities.png" alt="" width="600" height="300" /></a></p>
<p>У нас есть список сущностей с возможностью редактирования каждой из них в отдельной форме, а также добавлять новые — проще не бывает. Следующее решение, как всегда покажется необоснованно сложным для подобного примера, но незабываем, что перед нами стоит задача ознакомления с <em>Mate</em>, а не написания примера в 25 строк экшен-скрипта.</p>
<p>Я использую, так называемую схему <em>«двустороннего коммуницирования посредством модели и инжектинга»</em>, на сайте фреймворка есть отличная диаграма как этого так и других приёмов:</p>
<p><a href="http://Mate.asfusion.com/page/documentation/diagrams"><img class="alignnone" title="Two-way communication via model: Using view injection" src="http://tearaway-tea.googlecode.com/svn/trunk/opportunities/images/two_way_view_injection.png" alt="" width="594" height="629" /></a></p>
<p>Рассмотрим каждый элемент диаграмы основываясь на классах моего примера. Пункт 3 исключаем, так как для доступа к серверу мы используем специальный класс сервиса OpportunitiesMockService наследуемый от ServiceBase (я уже <a title="Паттерн для работы с RemoteObject" href="http://tearaway-tea.com/blog/2009/02/оптимальный-паттерн-для-работы-с-remoteobject/">описывал этот приём</a> ранее).</p>
<h3>Model</h3>
<p>Я определил три класса модели. Самый элементарный, зависимый от представления, класс элемента списка <a title="Class Definition" href="http://code.google.com/p/tearaway-tea/source/browse/trunk/opportunities/src/com/tearaway_tea/opportunities/model/OpportunityVO.as">OpportunityVO</a>. Второй класс <a title="Class Definition" href="http://code.google.com/p/tearaway-tea/source/browse/trunk/opportunities/src/com/tearaway_tea/opportunities/data/OpportunitiesDataProvider.as">OpportunitiesDataProvider</a>, является списком экземпляров OpportunityVO, он инкапсулирует в себе вызовы серверных методов и для удобства наследуется от ArrayCollection. Это даёт возможность использовать его провайдером данных для большинства списочных компонентов из Flex фреймворка.</p>
<p>Третий — <a title="Class Definition" href="http://code.google.com/p/tearaway-tea/source/browse/trunk/opportunities/src/com/tearaway_tea/opportunities/data/OpportunityDataProvider.as">OpportunityDataProvider</a>, предназначен для работы с конкретным редактируемым OpportunityVO из списка. У него есть публичное свойство <em>opportunity</em>, а также методы для манипуляций с ним. Этот класс диспатчит события <em>opportunityCreated</em> и <em>opportunitySaved</em> типа DataProviderEvent, которые информируют о завершении обработки opportunity (так как эти действия зачастую связаны с вызовом серверных методов, мы неможем ожидать их синхронного выполнения в потоке вызова методов класса). Реализация класса очень простая, но в реальности, в него нужно помещать все трансформации, инициализации и прочие процедуры над элементом, которые не связаны с логикой работы представления, и вполне успешно могут быть отделены от него.</p>
<p><img class="alignnone" title="Model Diagram" src="http://tearaway-tea.googlecode.com/svn/trunk/opportunities/images/model.png" alt="" width="481" height="265" /></p>
<p>Так же есть вспомогательный класс <a title="Class Definition" href="http://code.google.com/p/tearaway-tea/source/browse/trunk/opportunities/src/com/tearaway_tea/opportunities/data/OpportunityViewState.as">OpportunityViewState</a>, который используется для хранения информации о текущей видимой форме в представлении. Подобные классы приходится создавать для решения коммуникационных нюансов <em>Mate</em>, далее я их детально опишу.</p>
<h3>View</h3>
<p>Для представления также определены три класса, первый <a title="Class Definition" href="http://code.google.com/p/tearaway-tea/source/browse/trunk/opportunities/src/com/tearaway_tea/opportunities/views/OpportunitiesListView.mxml">OpportunitiesListView</a> для показа списка элементов. У него есть одно публичное свойство <em>dataProvider</em>, а также, он диспатчит два события <em>createOpportunity</em> и <em>editOpportunity</em> типа OpportunityEvent, которые говорят сами за себя.</p>
<p>Второй класс <a title="Class Definition" href="http://code.google.com/p/tearaway-tea/source/browse/trunk/opportunities/src/com/tearaway_tea/opportunities/views/OpportunityEditView.mxml">OpportunityEditView</a> определяется свойством <em>opportunity</em>, в которое нужно присваивать непосредственно объект редактирования OpportunityVO, а также он диспатчит другие два события <em>saveOpportunity</em> и <em>closeOpportunity</em> также типа OpportunityEvent.</p>
<p>Третий — <a title="Class Definition" href="http://code.google.com/p/tearaway-tea/source/browse/trunk/opportunities/src/com/tearaway_tea/opportunities/views/Index.mxml">Index</a>, является композицией предыдущих. В нём доступно свойство <em>selectedIndex</em>, которое определяет текущую видимую форму.</p>
<p><img class="alignnone" title="View Diagram" src="http://tearaway-tea.googlecode.com/svn/trunk/opportunities/images/view.png" alt="" width="481" height="283" /></p>
<p>Это наше представление. Как видим, его классы наследуются от стандартных контейнеров Flex фрейворка, они не имеют зависимостей от провайдеров данных модели, являются пассивными и выглядят как довольно самодостаточные компоненты для повторного использования — то, что нам и нужно.</p>
<h3>Mate Event Maps</h3>
<p>Перейдём непосредственно к роли <em>Mate</em> в связывании модели и представления. Все декларации этого фреймворка описываются в так называемых <em>«картах событий»</em>. Это MXML файлы, которые поддерживают биндинг и все остальные удобства <em>Flex Builder-а</em>. По мере увеличения проекта, эти карты довольно сильно разростаются, так что для разных групп коммуникаций я завожу отдельные файлы. В данном примере их четыре.</p>
<p>Одна из карт — <a title="Map Definition" href="http://code.google.com/p/tearaway-tea/source/browse/trunk/opportunities/src/com/tearaway_tea/opportunities/maps/DataInjectionMap.mxml">DataInjectionMap</a>, описывает связи между представлением и моделью, выполняется только один раз при запуске приложения. Это частичная реализация паттерна <em>IoC (Inversion of Control)</em>, которая работает необычным образом: при необходимости, она создаёт только экземпляры классов модели и слушая события родительского Application, в момент создания представлений, выполняет описанные связывания. Типичная нотация с использованием тегов Injectors и PropertyInjector:</p>
<pre><code>&lt;Injectors
	target="{OpportunitiesListView}"&gt;
 	&lt;PropertyInjector
		targetKey="dataProvider"
		source="{OpportunitiesDataProvider}" /&gt;
&lt;/Injectors&gt;</code></pre>
<p>Здесь мы задаем связь на основе биндинга между экземплярами классов OpportunitiesListView и OpportunitiesDataProvider посредством свойства <em>dataProvider</em>, данные которого в результате попадут в DataGrid.</p>
<p>Остальные: <a title="Map Definition" href="http://code.google.com/p/tearaway-tea/source/browse/trunk/opportunities/src/com/tearaway_tea/opportunities/maps/OpportunitiesEventMap.mxml">OpportunitiesEventMap</a>, <a title="Map Definition" href="http://code.google.com/p/tearaway-tea/source/browse/trunk/opportunities/src/com/tearaway_tea/opportunities/maps/DataProviderEventMap.mxml">DataProviderEventMap</a>, <a title="Map Definition" href="http://code.google.com/p/tearaway-tea/source/browse/trunk/opportunities/src/com/tearaway_tea/opportunities/maps/NavigationEventMap.mxml">NavigationEventMap</a>, непосредственно описывают действия, которые должны происходить при попадении в поле видимости <em>Mate (Event Bus)</em> каких-либо событий как из представления так и из классов модели. Например, нотация с использованием тегов EventHandlers, MethodInvoker и EventAnnouncer:</p>
<pre><code> &lt;EventHandlers
	type="{OpportunityEvent.EDIT_OPPORTUNITY}"&gt;
 	&lt;MethodInvoker
		generator="{OpportunityDataProvider}"
		method="editOpportunity"
		arguments="{[event.data]}"/&gt;
 	&lt;EventAnnouncer
		type="{NavigationEvent.NAVIGATE_EDIT_VIEW}"
		generator="{NavigationEvent}"/&gt;
&lt;/EventHandlers&gt;</code></pre>
<p>Это выражение читается так: в тот момент когда представление продиспатчит событие <em>editOpportunity </em>(по-сути нажатие кнопки Edit), у экземпляра класса модели OpportunityDataProvider должна запуститься операция редактирования экземпляра класса OpportunityVO, которые доступен из события.</p>
<p>Так же, посылается специальное событие NavigationEvent, в результате которого представление должно переключиться в режим редактирования. Внутри класса OpportunityDataProvider, должен произойти вызов серверного метода для получение экземпляра OpportunityVO с последним состоянием элемента (но в моём примере, я упростил схему, и сохраняю в свойстве <em>opportunity</em> модели, тот же объект). Далее, так как мы указали связывание<em> (injection)</em> в DataInjectionMap между OpportunityEditView и OpportunityDataProvider по свойству opportunity, редактируемый элемент будет доступен в представлении.</p>
<p>В свойствах <em>generator</em> или <em>source</em> вышеописанных тегов, мы указываем класс модели, не экземпляр этого класса. <em>Mate</em> автоматически создаст экземпляр в нужный момент, причём, по-умолчанию, только один раз. Фреймворк имеет внутренний кеш для всевозможных экземпляров модели или событий, и ищет там необходимые объекты для повторного использования. Эта схема похожа на паттерн <em>Singleton</em>, но она гораздо практичнее, так как нет лишнего связывания между сущностями системы, которые неизбежны при использовании <em>«одиночек»</em> (кстати, довольно сильный недостаток прочих фреймворков типа <em>Cairngorm</em> или <em>PureMVC</em>).</p>
<p>И напоследок, рассмотрим специфику карты NavigationEventMap, в которой описаны ответные действия на события NavigationEvent. В общем-то, переключение режимов представления могло бы быть реализовано непосредственно в нём. Но, как показала практика, в больших проектах, визуально легче контролировать подход внешнего управления представлением. Например, если необходимо подключить <em>deep-linking </em>(поддержку изменения адресной строки броузера), мы введём ещё один тип событий BrowserNavigationEvent, которые будут использовать уже готовые списки действий в картах <em>Mate</em>. Итак, нотация:</p>
<pre><code>&lt;EventHandlers
	type="{NavigationEvent.NAVIGATE_EDIT_VIEW}"&gt;
 	&lt;MethodInvoker
		generator="{OpportunityViewState}"
		method="setSelectedIndex"
		arguments="{[1]}" /&gt;
&lt;/EventHandlers&gt;</code></pre>
<p>При попадении в <em>Mate</em> события <em>navigateEditView</em>, вызывается метод у вспомогательного класса модели OpportunityViewState, который является проксирующим. Я не хотел бы вводить для этих целей этот класс, а бы присваивал значения в <em>selectedIndex</em> прямо в классе представления Index, но в свойство <em>generator</em> тега MethodInvoker (как и всех других тегов), нельзя указывать классы визуальных компонентов (то-есть можно, но это будет неправильно, так как фреймворк создаст экземпляр, недоступный никому). Суть в том, что, как я уже писал выше, <em>Mate</em> не создаёт экземпляры визуальных компонентов(и не пытается, это делает MXML), он слушает события всего приложения, и когда компонент попадёт в <em>display list</em> флеш плеера, фреймворк начинает с ним «сотрудничать» (зачастую для определения (<em>injection</em>) зависимостей). Получается, что есть внутренний кеш всех созданных классов самим фреймворком и отдельный список компонентов, которыми заведует сам флеш плеер и они не пересекаются между собой.</p>
<p>Вот и всё. Информацию о всех доступных тегах фреймворка можна найти в <a title="Mate's Tags Description" href="http://mate.asfusion.com/page/documentation/tags">документации</a> на сайте <em>Mate</em>. Надеюсь описание не получилось чересчур запутанным. С удовольствием отвечу на все адекватные вопросы по теме.</p>
<p>P.S. Кстати, на днях вышло обновление <em>Mate</em> до версии <em>0.8.7</em>, в котором появилась возможность задавать связи (<em>injection</em>) между интерфейсами.</p>
<img src="http://feeds.feedburner.com/~r/goverlaflexblog/~4/AsnxEuxoo_I" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tearaway-tea.com/blog/2009/03/usage-example-of-mate-flex-framework/ru/feed/ru/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		<feedburner:origLink>http://tearaway-tea.com/blog/2009/03/usage-example-of-mate-flex-framework/ru/</feedburner:origLink></item>
		<item>
		<title>Нужен человек, готовый на Флекс</title>
		<link>http://feedproxy.google.com/~r/goverlaflexblog/~3/9NNCHqk1we0/</link>
		<comments>http://tearaway-tea.com/blog/2009/03/flex-guys-wanted/ru/#comments</comments>
		<pubDate>Mon, 02 Mar 2009 12:36:13 +0000</pubDate>
		<dc:creator>tearaway_Tea</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://tearaway-tea.com/blog/?p=176</guid>
		<description><![CDATA[Как-то раз, в августе, я давал объявление о поиске людей, которые без особого опыта в Флексе не прочь подучиться ему, параллельно выполняя прямые обязанности программиста(junior level). Люди нашлись, с некоторыми из них мы(компания EPAM Systems) до сих пор успешно сотрудничаем.
Нам нужен ещё один человек. Желательно начинающий, можно студент, очень энергичный и с толковой головой(акцентировка на [...]]]></description>
			<content:encoded><![CDATA[<p>Как-то раз, <a href="http://tearaway-tea.com/blog/2008/08/устроился-на-постоянную-работу-в-офис/">в августе</a>, я давал объявление о поиске людей, которые без особого опыта в Флексе не прочь подучиться ему, параллельно выполняя прямые обязанности программиста(<em>junior level</em>). Люди нашлись, с некоторыми из них мы(компания <em>EPAM Systems</em>) до сих пор успешно сотрудничаем.</p>
<p>Нам нужен ещё один человек. Желательно начинающий, можно студент, очень энергичный и с толковой головой(акцентировка на <em>ООП</em>). Не нужен флексер-профи(их мало, в основном все врут), приветствуются специалисты из <em>C#</em>, <em>Java</em>.</p>
<p>Я готов передавать свой опыт и знания в ходе работы и тщательно следить за кодом, архитектурными решениями и т.п. Зарплата будет не большая, но, тем не менее, для начинаючих специалистов, это может быть интересным предложением, так как обучим быстро и неплохо.</p>
<p>Кто заинтересован, оставляйте адреса в комментах.</p>
<p><strong>UPD.</strong> Работа предполагает полную занятость в офисе, в городе <em>Киеве</em>, <em>Украина</em>.</p>
<p><strong>UPD.</strong> Вакансия закрыта — новый сотрудник найден.</p>
<img src="http://feeds.feedburner.com/~r/goverlaflexblog/~4/9NNCHqk1we0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tearaway-tea.com/blog/2009/03/flex-guys-wanted/ru/feed/ru/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://tearaway-tea.com/blog/2009/03/flex-guys-wanted/ru/</feedburner:origLink></item>
		<item>
		<title>Спасибо тебе, 100-ый читатель</title>
		<link>http://feedproxy.google.com/~r/goverlaflexblog/~3/JDXojaRf5UU/</link>
		<comments>http://tearaway-tea.com/blog/2009/02/%d1%81%d0%bf%d0%b0%d1%81%d0%b8%d0%b1%d0%be-%d1%82%d0%b5%d0%b1%d0%b5-100-%d1%8b%d0%b9-%d1%87%d0%b8%d1%82%d0%b0%d1%82%d0%b5%d0%bb%d1%8c/ru/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 18:54:00 +0000</pubDate>
		<dc:creator>tearaway_Tea</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://tearaway-tea.com/blog/?p=167</guid>
		<description><![CDATA[Статистика feedburner показывает на счётчике очень кругленькую цифру в 100 подписчиков на RSS моего блога! Очень приятно конечно и всё такое. Этот результат достигнут за пол-года его вминяемого существования, с дизайном и со старательно оформленными статьями.
В последнее время писать мне хочется всё больше и больше — верный показатель старения и остепенения.  Да и писать есть [...]]]></description>
			<content:encoded><![CDATA[<p>Статистика <em>feedburner</em> показывает на счётчике очень кругленькую цифру в <strong>100</strong> подписчиков на RSS моего блога! Очень приятно конечно и всё такое. Этот результат достигнут за пол-года его вминяемого существования, с дизайном и со старательно оформленными статьями.</p>
<p>В последнее время писать мне хочется всё больше и больше — верный показатель старения и остепенения.  Да и писать есть о чём, хоть <em>Adobe</em> до сих пор так и не выпустила <em>Flex 4</em>(после чего ожидается просто шквал впечатлений в блогах всех флексеров), всё таки каждый день приходится сталкиваться уже не столько с неприятностями флекса, сколько с архитектурными вызовами на смекалку.</p>
<p>Stay tuned.</p>
<img src="http://feeds.feedburner.com/~r/goverlaflexblog/~4/JDXojaRf5UU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tearaway-tea.com/blog/2009/02/%d1%81%d0%bf%d0%b0%d1%81%d0%b8%d0%b1%d0%be-%d1%82%d0%b5%d0%b1%d0%b5-100-%d1%8b%d0%b9-%d1%87%d0%b8%d1%82%d0%b0%d1%82%d0%b5%d0%bb%d1%8c/ru/feed/ru/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://tearaway-tea.com/blog/2009/02/%d1%81%d0%bf%d0%b0%d1%81%d0%b8%d0%b1%d0%be-%d1%82%d0%b5%d0%b1%d0%b5-100-%d1%8b%d0%b9-%d1%87%d0%b8%d1%82%d0%b0%d1%82%d0%b5%d0%bb%d1%8c/ru/</feedburner:origLink></item>
		<item>
		<title>Пример использования «слабых» ссылок</title>
		<link>http://feedproxy.google.com/~r/goverlaflexblog/~3/wKJVevSoM7g/</link>
		<comments>http://tearaway-tea.com/blog/2009/02/%d0%bf%d1%80%d0%b8%d0%bc%d0%b5%d1%80-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d1%8f-%c2%ab%d1%81%d0%bb%d0%b0%d0%b1%d1%8b%d1%85%c2%bb-%d1%81%d1%81%d1%8b%d0%bb%d0%be/ru/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 18:39:28 +0000</pubDate>
		<dc:creator>tearaway_Tea</dc:creator>
				<category><![CDATA[Action Script]]></category>

		<guid isPermaLink="false">http://tearaway-tea.com/blog/?p=160</guid>
		<description><![CDATA[Тема «слабых» ссылок при установлении функций-слушателей (англ. listener) для событий в Action Script уже подымалась не раз несколько лет подряд. Я, например, стараюсь следить за всеми новостями от Adobe, давно знавший о их существовании, тем не менее, понял их суть совсем недавно, только после использования профайлера в Flex Builder.
Известный товарищ gskinner ещё в далёком 2006 [...]]]></description>
			<content:encoded><![CDATA[<p>Тема «слабых» ссылок при установлении функций-слушателей (англ. listener) для событий в <em>Action Script</em> уже подымалась не раз несколько лет подряд. Я, например, стараюсь следить за всеми новостями от Adobe, давно знавший о их существовании, тем не менее, понял их суть совсем недавно, только после использования профайлера в <em>Flex Builder</em>.</p>
<p>Известный товарищ <em>gskinner</em> ещё в далёком 2006 году <a title="AS3: Weakly Referenced Listeners" href="http://gskinner.com/blog/archives/2006/07/as3_weakly_refe.html">удивлялся</a> почему все слушатели по умолчанию не подключаются в режиме <em>weak reference</em>, а некоторые ребята на Хабре, в комментах к <a title="Контексты функций в Action Script" href="http://habrahabr.ru/blogs/flex/52458/">статье про контексты функций</a>, вообще считают, что «слабые» ссылки от нечистого и все операции по удалению онных нужно производить исключительно вручную!</p>
<p>Вместо пересказывания справочной информации я приведу пример, в котором я вижу исключительную полезность использования «слабых» ссылок.</p>
<p><span id="more-160"></span></p>
<pre><code>public class GuestbookEntry
{
	public function get comments() : ArrayCollection
	{
		return _comments;
	}

	public function set comments(value : ArrayCollection) : void
	{
		if (_comments != null)
		{
			_comments.removeEventListener(CollectionEvent.COLLECTION_CHANGE,
				onCommentsChange);
		}

		_comments = value;

		if (value != null)
		{
			value.addEventListener(CollectionEvent.COLLECTION_CHANGE,
				onCommentsChange, false, 0, true);
		}
	}

	protected function onCommentsChange(event : CollectionEvent) : void
	{
		switch (event.kind)
		{
			case CollectionEventKind.ADD :
				CommentEntry(event.items[0]).guestbookEntry = this;
				break;
		}
	}

	private var _comments : ArrayCollection;
}</code></pre>
<p>Представим, у нас есть гостевая книга, и тип её записи GuestbookEntry представленый выше. У этого типа есть коллекция комментариев. Пусть комментарий описывается типом CommentEntry. Где-то есть форма для добавления новых комментов, у нас есть требование архитектуры проекта, что-бы каждый коммент имел ссылку на запись книги посредством свойства <em>guestbookEntry</em>.</p>
<p>Экземпляры GuestbookEntry скорее всего будут получены от сервера, неважно. В сетере свойства comments я подписываюсь на событие изменения коллекции, что-бы контроллировать  момент добавления нового коммента. Как видим, ссылка на функцию <em>onCommentsChange</em> передаётся в коллекцию как «слабая» (последний аргумент метода <em>addEventListener</em>).</p>
<p>Во время профайлинга приложения с подобным кодом, до использования в нём «слабой» ссылки,  в памяти оставались все когда-либо созданые экземпляры класса GuestbookEntry. Инспектор «висячих» (англ. loitering) объектов показывал две связи между экземплярами GuestbookEntry и CommentEntry: одна посредством свойства <em>guestbookEntry</em>, другая, косвенная, посредством функции <em>onCommentsChange</em> (её экземпляр хранился в коллекции комментов, а <em>savedThis </em>(по-сути, <a title="Контексты функций в Action Script" href="http://tearaway-tea.com/blog/2009/02/контексты-функций-в-action-script/">контекст функции</a>) у функции ссылался на запись гостевой).</p>
<p>На сколько я понял, сборщик мусора в <em>Flash Player</em> автоматически очищает память от связаных между собой объектов только через прямые ссылки (циклические вчастности), если же есть косвенные (все подписки на события) связи, он — бессилен. Сдесь нам и помагают «слабые» ссылки. Никакого риска использования их нет, так как это, зачастую, последние оставшиеся ссылки между объектами, готовыми к удалению.</p>
<p>Внимательный читатель, который любит <em>Фаулера</em>, заметит и спросит о том, что нам мешает удалять в ручную такие ссылки? А я отвечу — ничего не мешает, но подобные решения будут громоздкими и некрасивыми. В данном случае, мне нужно было бы реализовать в типе GuestbookEntry, что-то вроде метода <em>dispose()</em>:</p>
<pre><code>public function dispose() : void
{
	comments = null;
}</code></pre>
<p>И вызывать этот метод во всех местах потенциального «прощания» с экземплярами записей гостевой книги. Скучно, старомодно и не практично.</p>
<p><strong>UPD:</strong> Поразмыслив с коллегами по работе, выяснилось пару аспектов когда «слабые» ссылки могут подложить вам свинью. Например, если у вас остался «неприкаянный» объект, на который ссылаются «слабой» ссылкой, до момента уничтожения его сборщиком мусора, он будет получать события (ведь ссылка есть) и возможно, обработка этих событий будет вами не запланирована, так как вы, уже, мысленно «распрощались» с объектом. Что-бы избежать подобных ситуаций, конечно-же, нужно удалять слушателей вручную.</p>
<p>В данном примере криминала нет, так как записи гостевой книги с их комментариями удаляются комплексно, то изменение коллекции комментов, после удаления прямых ссылок на экземпляры GuestbookEntry и до уничтожения их сборщиком — невозможно.</p>
<img src="http://feeds.feedburner.com/~r/goverlaflexblog/~4/wKJVevSoM7g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tearaway-tea.com/blog/2009/02/%d0%bf%d1%80%d0%b8%d0%bc%d0%b5%d1%80-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d1%8f-%c2%ab%d1%81%d0%bb%d0%b0%d0%b1%d1%8b%d1%85%c2%bb-%d1%81%d1%81%d1%8b%d0%bb%d0%be/ru/feed/ru/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://tearaway-tea.com/blog/2009/02/%d0%bf%d1%80%d0%b8%d0%bc%d0%b5%d1%80-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d1%8f-%c2%ab%d1%81%d0%bb%d0%b0%d0%b1%d1%8b%d1%85%c2%bb-%d1%81%d1%81%d1%8b%d0%bb%d0%be/ru/</feedburner:origLink></item>
		<item>
		<title>Контексты функций в Action Script</title>
		<link>http://feedproxy.google.com/~r/goverlaflexblog/~3/kFMVro1yhGA/</link>
		<comments>http://tearaway-tea.com/blog/2009/02/%d0%ba%d0%be%d0%bd%d1%82%d0%b5%d0%ba%d1%81%d1%82%d1%8b-%d1%84%d1%83%d0%bd%d0%ba%d1%86%d0%b8%d0%b9-%d0%b2-action-script/ru/#comments</comments>
		<pubDate>Fri, 20 Feb 2009 14:13:04 +0000</pubDate>
		<dc:creator>tearaway_Tea</dc:creator>
				<category><![CDATA[Action Script]]></category>

		<guid isPermaLink="false">http://tearaway-tea.com/blog/?p=130</guid>
		<description><![CDATA[Я люблю использовать анонимные функции, передавать функции по ссылке, объявлять функции прямо в теле другой функции и т.п. Это удобно и практично, но с этими механизмами могут возникнуть некоторые проблемы. Начиная с версии 9 Flash Player сохраняет в this функции её родителя. Звучит просто, но все ли понимают, что это значит и как тяжело было [...]]]></description>
			<content:encoded><![CDATA[<p>Я люблю использовать анонимные функции, передавать функции по ссылке, объявлять функции прямо в теле другой функции и т.п. Это удобно и практично, но с этими механизмами могут возникнуть некоторые проблемы. Начиная с версии 9 <em>Flash Player</em> сохраняет в <em>this</em> функции её родителя. Звучит просто, но все ли понимают, что это значит и как тяжело было раньше без этого?</p>
<p>Например, теперь можно описать такую функцию:</p>
<pre><code>public class TestClass
{
	var property : Number;

	function updateValue(value : Number) : void
	{
		TestClass(this).property = value;
	}
}</code></pre>
<p>и передавать её куда угодно:</p>
<pre><code>var func : Function = new TestClass().updateValue;
func(555);</code></pre>
<p>и быть уверенным, где-бы её не вызвали в <em>this</em> будет экземпляр класса TestClass. Но я не об этом, есть более любопытные действия, которые можно производить над функциями в <em>Action Script</em>, их мы их рассмотрим.<br />
<span id="more-130"></span></p>
<h3>Асинхронные вызовы</h3>
<p>Скорее всего вы сталкивались с задачей вызова удаленного метода на сервере и обработки результата этого вызова. Допустим у нас есть класс сервиса <a title="Подробнее о паттерне" href="http://tearaway-tea.com/blog/2009/02/оптимальный-паттерн-для-работы-с-remoteobject/">ServerService</a>, который принимает в конструктор ссылку на функцию, которая должна обработать ответ и мы выполняем типичную задачу обновления свойства исходного объекта:</p>
<pre><code>class Example
{
	function updateItem(item : SomeObject) : void
	{
		_tempObject = item;
		new ServerService(onGetResult).getResult(item.startValue);
	}

	function onGetResult(result : Object) : void
	{
		_tempObject.endValue = result;
	}

	private var _tempObject : SomeObject;
}</code></pre>
<p>Всё написано верно, но зачем так сложно? Давайте упростим подобную ерунду, «умным» кодом:</p>
<pre><code>function updateItem(item : SomeObject) : void
{
	new ServerService(onGetResult).getResult(item.startValue);

	function onGetResult(result : Object) : void
	{
		item.endValue = result;
	}
}</code></pre>
<p>В данном случае функция <em>onGetResult</em> имеет доступ ко всем переменным функции <em>updateItem</em> и к её аргументу <em>item</em> в частности. Такой прием во многих случаях может сократить объем кода и убрать негативный оттенок асинхронности. Кстати, в <em>this</em> функции <em>onGetResult</em> будет уже не экземпляр Example, а просто <em>global</em>.</p>
<h3>Множественные асинхронные вызовы</h3>
<p>Ещё интереснее ситуации когда нужно сделать несколько асинхронных запросов в цикле, а затем обработать каждый ответ соответственно, например:</p>
<pre><code>function updateItems(items : ArrayCollection) : void
{
	for each (var item : SomeObject in items)
	{
		new ServerService(onGetResult).getResult(item.startValue);
	}

	function onGetResult(result : Object) : void
	{
		item.endValue = result;
	}
}</code></pre>
<p>Данным кодом мы не достигнем желаемого результата. В тот момент когда сервер вернёт нам ответы, переменная <em>item</em> будет ссылаться на последний элемент коллекции <em>items</em> и все данные присвоятся только ему, слишком много чести! В таких ситуациях не помогает ни сохраняемый контекст функции ни область видимости переменных родителя, тут нужно что-то другое.</p>
<p>Зачастую можно воспользоваться так называемым Loader-ом:</p>
<pre><code>function updateItems(items : ArrayCollection) : void
{
	for each (var item : SomeObject in items)
	{
		new ValueLoader(item);
	}
}

class ValueLoader
{
	public function ValueLoader(item : SomeObject)
	{
		new ServerService(onGetResult).getResult(item.startValue);

		function onGetResult(result : Object) : void
		{
			item.endValue = result;
		}
	}
}</code></pre>
<p>Так как контекста функции недостаточно что-бы сохранить <em>item</em> для обновления его после ответа сервера, мы создаем над функцией обёртку — класс, которые способен запомнить в контексте всё что нужно. Так как конструктор класса всё та же функция, аргумент <em>item</em> без проблем будет доступен в функции <em>onGetResult</em>.</p>
<h3>Стандартизированый объект ContextFunction</h3>
<p>В конце концов, если вы нежелаете плодить массу всевозможных Loader-ов, можно ввести универсальный тип — паттерн для многократного использования:</p>
<pre><code>class ContextFunction
{
	public function ContextFunction(targetFunction : Function, ... args)
	{
		_contextArgumnets = args;
		_targetFunction = targetFunction;
	}

	public function func(... args) : void
	{
		var targetArguments : Array = args.concat(_contextArgumnets);
		_targetFunction.apply(this, targetArguments);
	}

	private var _contextArgumnets : Array;

	private var _targetFunction : Function;
}</code></pre>
<p>Суть решения в том, что экземпляр ContextFunction определяется ссылкой на функцию с конкретной логикой и набором неопределённых аргументов, которые получит функция, когда её кто-то вызовет. Так же, к этим аргументам добавятся ещё что-то, по желанию вызывающей сущности. Рассмотрим пример для прояснения:</p>
<pre><code>function updateItems(items : ArrayCollection) : void
{
	for each (var item : SomeObject in items)
	{
		new ServerService(new ContextFunction(onGetResult, item).func).
			getResult(item.startValue);
	}
}

function onGetResult(result : Object, item : SomeObject) : void
{
	item.endValue = result;
}</code></pre>
<p>Это по-сути то же решение, что и с Loader-ом, только более универсальное. Экземпляр ContextFunction сохраняет <em>onGetResult</em>, которая получит ответ от сервера, а также ссылку на <em>item</em> для которого запрашивалось серверное значение. То-есть, мы, отказываясь от контекста функции вообще, используем экземпляр вспомагательного класса, для сохранения нужных значений.</p>
<p>В заключение, могу вас уверить, что все эти трюки используются мной на практике очень часто и эффективно. Это не высосанные из пальца проблемы.</p>
<img src="http://feeds.feedburner.com/~r/goverlaflexblog/~4/kFMVro1yhGA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tearaway-tea.com/blog/2009/02/%d0%ba%d0%be%d0%bd%d1%82%d0%b5%d0%ba%d1%81%d1%82%d1%8b-%d1%84%d1%83%d0%bd%d0%ba%d1%86%d0%b8%d0%b9-%d0%b2-action-script/ru/feed/ru/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://tearaway-tea.com/blog/2009/02/%d0%ba%d0%be%d0%bd%d1%82%d0%b5%d0%ba%d1%81%d1%82%d1%8b-%d1%84%d1%83%d0%bd%d0%ba%d1%86%d0%b8%d0%b9-%d0%b2-action-script/ru/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 8.619 seconds. --><!-- Cached page generated by WP-Super-Cache on 2009-11-09 05:22:30 -->
