Err the Blog Atom Feed Icon
Err the Blog
Rubyisms and Railities
  • “Evil Twin Plugin”
    – Chris on November 20, 2007

    Advertisement

    Seriously, I think I have something against Rails’ lib directory. We jumped from keeping gems in lib to vendor/gems back in March. Then we jumped from keeping generic Rake tasks in lib/tasks to Sake. Now we’re gonna jump again.

    Hacking Plugins

    It’s really not that big of a deal, and pretty common—you want to change the behavior of some existing plugin. Maybe you Piston it and commit your changes. Sure. But maybe you just want to leave the original code alone.

    A classic approach has been to stick some kind of hack in the lib directory. Issues abound, for sure. First: the load order. Who gets loaded first? Who reloads and who doesn’t? Second: location. You’ve got one bit of code messing with another bit of code in a totally separate location. Third: testing. Are you testing it? Maybe.

    None of these things are deal breakers, but we can certainly address them. And we will.

    The Evil Twin Plugin

    Evil Twin

    Here’s the simple solution: create a plugin called whatever_hacks, where whatever is the name of the plugin you’re hacking. That’s it. An evil twin, if you will.

    Adding the _hacks suffix ensures it will always be loaded after the target plugin (assuming you haven’t messed with the default plugin load order—alphabetical). Keeping it right next to the target plugin also ensures anyone who peers into vendor/plugins will instantly know tomfoolery is afoot.

    You can now build out a tested, hack happy plugin. Or, y’know, just stick it all in init.rb. With caution.

    Caution: init.rb

    Caution: init.rb does not always do what you expect it to do. It’s loaded in the context of Rails::Plugin in 2.0 and Rails::Initializer in 1.2.5, not Object. Come again? Like this: re-opening existing classes isn’t as straightforward as elsewhere.

    => init.rb
    class Hash
    end
    puts Hash.inspect
    

    Guess what that prints. Ready?

    $ ./script/runner 
    Rails::Plugin::Hash
    

    That’s right—we didn’t re-open Hash, we created a new Rails::Plugin::Hash class. Any methods we add in there won’t be added to Hash proper.

    If we want to grab a real class and stuff some methods in it, we need to use class_eval or module_eval:

    => init.rb
    Hash.class_eval do
      def duck_punched?
        true
      end
    end  
    
    puts({}.duck_punched?)
    

    As expected:

    $ ./script/runner 
    true
    

    Doing it this way (class_eval) forces a constant lookup, making Ruby happily run up the chain and find the class or module in question.

    attachment_fu_cropper

    Okay, time for a real example. I wanted to change attachment_fu’s ImageScienceProcessor to crop thumbnails before resizing them. As this is a hack I use on all my apps, I also want to keep it out of my models. Hence, attachment_fu_hacks.

    => vendor/plugins/attachment_fu_hacks/init.rb
    klass = Technoweenie::AttachmentFu::Processors::ImageScienceProcessor
    klass.module_eval do
      ##
      # Hacked to use image_science's #cropped_thumbnail method
      def resize_image(img, size)
        # create a dummy temp file to write to
        filename.sub! /gif$/, 'png'
        self.temp_path = write_to_temp_file(filename)
        grab_dimensions = lambda do |img|
          self.width  = img.width  if respond_to?(:width)
          self.height = img.height if respond_to?(:height)
          img.save temp_path
          callback_with_args :after_resize, img
        end
    
        size = size.first if size.is_a?(Array) && size.length == 1
        if size.is_a?(Fixnum) || 
            (size.is_a?(Array) && size.first.is_a?(Fixnum))
          if size.is_a?(Fixnum)
            img.cropped_thumbnail(size, &grab_dimensions)
          else
            img.cropped_thumbnail(size.first, &grab_dimensions)
          end
        else 
          new_size = [img.width, img.height].dim size.to_s
    
          img.cropped_thumbnail(new_size.first, &grab_dimensions)
        end
      end
    end 
    

    Works like a charm.

    When heavysixer wanted to hack acts_as_taggable, he took the same approach: http://pastie.caboo.se/119904. Feel free to follow suit.

  • Garry, about 1 hour later:

    Ah, neat tip. I like that putting “_hacks” at the end ensures it loads after the real plugin, load order being alphabetical and so on. I hadn’t thought of that!

  • Jon Maddox, about 1 hour later:

    Hilarious. As I was reading through this, I was thinking about the patch I did for cropping with Attachment_fu. Creepy.

    This is sweet, I’ll try to factor out my patch using this method. I’ve never been a big fan of patching plugins directly, especially if you need to reuse what you did to it. This keeps it dry and distributable. Pretty slick.

  • d, about 1 hour later:

    im hacking our acts_as_taggable_ext, and this flies into my rss reader. cue twilight zone music.

  • Sebastian, about 1 hour later:

    We have a separate RAILS_ROOT/plugins directory for our “own” plugins (and pluginized code, to keep lib clean).

    We also have a “snippets” plugin that mimics the ActiveSupport Railties folders, with names for each object or library we are patching, and a simple init.rb that loads all files inside lib:

    Dir[File.dirname(FILE) + ”/lib/*/.rb”].each { |file| require(file) }}

    There we store dozens of patches and little tweaks to ruby, rails and other plugins.

    Having a separate whatever_hacks plugins makes sense if the changes are significant, but I rather have a single plugin for trivial snippets.

  • David Goodlad, about 4 hours later:

    Instead of the whole class_eval business, can’t you just do:

    class ::Hash def foo; ‘bar’; end end

  • Chris, about 6 hours later:

    ::Hash? Gross!

  • Mislav, about 7 hours later:

    “Gross, LOL :)

    Remember when I wrote” in will_paginate? One of you guys couldn’t stand it :D

  • Mislav, about 7 hours later:

    I said remember when I wrote ::Hash

    Textile sucks, seriously

  • Chris, about 7 hours later:

    Textile? Gross!

  • Garry, about 10 hours later:

    LOL

  • Ryan Platte, about 16 hours later:

    The issues with init.rb are due to its weird implementation within Rails involving eval. I recommend running nothing but requires from within init.rb to make everything nice and clean—required files work as expected with no fallout that I’m aware of from the eval.

  • Jim, about 18 hours later:

    A little off topic, but how do you use your Attachment_fu hack so that you can get square (cropped) thumbnails?

  • Carl, 2 days later:

    Jim, all you have to do is put that code in the attachment_fu_hack dir as init.rb. When I tried it I got ‘undefined method `dim’ for Array’ error. I haven’t looked too closely but he probably just method that attachment_fu defines in Array. Chris may want to correct me on that though.

  • rick, 4 days later:

    I love that you give these old conventions cool names. I made the original commit to rails that orders the plugins before loading them to make this kind of thing possible. Then, someone made a hacked version of acts_as_versioned that worked with associated models or something. Cool, hacky shit.

  • topfunky, 23 days later:

    I was using lib/duck_punches, but this makes much more sense.

  • punkrats, 2 months later:

    Jim, just replace one line, and it’ll work:

    new_size = [img.width, img.height] / size.to_s

    Cheers.

  • , 3 months later:

    So this technique totally overwrites whatever method you’re extending?

    For example, you hack resize_image above.

    You have have to implement this whole method, you can just edit a few args and call super(img, new_size) and have the original resize_image finish.

    Would this be correct?

  • Ade, 5 months later:

    Here’s a version that uses RMagick and also supports desaturation:

    (I hope I get the textile

     tags right!)
    
    <pre>
    klass = Technoweenie::AttachmentFu::Processors::RmagickProcessor
    klass.module_eval do
      ##
      # Hacked to allow cropping
        # see comment by Martyn Loughran at http://toolmantim.com/article/2006/9/12/generating_cropped_thumbnails_with_acts_as_attachment
        def resize_image(img, size)
        size = size.first if size.is_a?(Array) && size.length == 1 && !size.first.is_a?(Fixnum)
        if size.is_a?(Fixnum) || (size.is_a?(Array) && size.first.is_a?(Fixnum))
          size = [size, size] if size.is_a?(Fixnum)
          img.thumbnail!(*size)
        # This elsif extends
            # extended again by Adrian Duyzer to support desaturation
        elsif size.is_a?(Hash)
                img = img.quantize(256, Magick::GRAYColorspace) if size[:desaturate]
          dx, dy = size[:crop].split(':').map(&:to_f)
          w, h = (img.rows * dx / dy), (img.columns * dy / dx)
          img.crop!(::Magick::CenterGravity, [img.columns, w].min, [img.rows, h].min)
          size = size[:size]
          w2, h2 = size.split('x').map(&:to_f)
          img.resize!(w2,h2)
        else
          img.change_geometry(size.to_s) { |cols, rows, image| image.resize!(cols, rows) }
        end
        self.temp_path = write_to_temp_file(img.to_blob)
      end
    end 
    </pre>
    
    Use like so (note the different way that thumbnail sizes are specified from the main size):
    
    <pre>
        has_attachment :content_type => :image, 
                     :storage => :file_system, 
                     :max_size => 5.megabytes,
                     :resize_to => {:crop => "375:430", :size => '375x430', :desaturate => true},
                     :thumbnails => {
                                         :medium => [:crop => "185:205", :size => '185x205', :desaturate => true],
                                         :small => [:crop => "1:1", :size => '100x100', :desaturate => true] 
                                     }
    </pre>

  • Ade, 5 months later:

    Annnd…I got the textile tags wrong. Maybe you guys can fix it up for me.

  • aaaswq, 7 months later:

    The best article, thanks to the author. good jokes, funny jokes

  • , 10 months later:

    Cruise Critics Lower Back Tattoos Victorias Secret Victorias Secret Womens Clothing Victorias Secret Bra Victorias Secret Swim Wear Victorias Secret Thong Victorias Secret Credit Card Victorias Secret Angel Credit Card

    Victorias Secret Online Catalog Victorias Secret Coupon Code Victorias Secret Coupon Victorias Secret Pink Victorias Secret Lingerie Victorias Secret Angels Victorias secret promotion code Victorias Secret Commercial Victorias Secret Store Location and Outlets Victorias Secret Products Victorias Secret History Victorias Secret Sale Victorias Secret Models Victorias Secret Fashion Show

    Audrina Patridge Fashion Layered Hairstyles Layered Hair Styles Layered Hairstyle Calvin Klein Calvin Klein Fragrance Calvin Klein Underwear Calvin Klein Cologne Calvin Klein Bra Calvin Klein Boxer Calvin Klein Bikini

    Calvin Klein 365 Calvin Klein Perfume Calvin Klein Jeans Calvin Klein Briefs Calvin Klein Dresses Calvin Klein Men Calvin Klein Lingerie Calvin Klein Clothing Calvin Klein Models Lower Back Tattoos Victorias Secret

  • Heart Tattoos, 10 months later:

    Tattoos Celtic Tattoos Lower Back Tattoos Dragon Tattoos Skull Tattoos Heart Tattoos Butterfly Tattoos Chinese Tattoos Layered Hair Styles Layered Hairstyles Emo Hairstyles Medium Hairstyles Bang Hairstyle Prom Hairstyle Hair Coloring Heart Lower Back Tattoos

  • sıcak, 10 months later:

    sikiş porno sex video izle iyi porno uzun porno yeni pornolar porno seyret sex seyret porno filmler sex izleyin sex izle porno sex erotik porn video türk porno canlı porno porno izle porno porno film sex filmleri porn video porno film sex seyret porno video seyret orgazm porno seks izle erotik video sex videolar yetişkin video sex video izle porno video izle bedava porno 18 video seks porno sıcak izle yetişkin film sikiş seyret sex amatör videolar teen video erotik videolar yetişkin video yetişkin videolar pornolar porno video teen kızlık bozma sikiş sikiş video seks türban sex sex erotik seks izle sıcak ateşli

  • ads, 10 months later:

    modern abstract art sofa manufacturer гранит 净水器 混合机 过滤机 DHL快递 保险箱 法兰 法兰标准 牛皮癣 皮肤病 北京快递公司 北京国际快递 传世私服 传奇世界私服 天龙八部私服 天龙私服 网络电话 免费网络电话 假发 补发 织发 植发 上海搬家公司 上海搬场公司 大众搬家 大众搬场 张家界旅游 香港旅游 深圳旅行社 打包机 收缩机 萎缩性胃炎 neoprene laptop bags SEO优化 SEO优化 计量泵 胃炎 胃病 冷水机 冰水机 工业冷水机 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 北京办证 办证 北京特价机票 北京打折计票 北京国际机票 北京机票预定 北京飞机票 北京订机票 北京机票查询 血糖仪 血糖仪 银杏 水培花卉 企业宣传片 空分设备 机电设备安装 代孕 代孕网 代孕 代孕 代孕 试管婴儿 代孕 电话交换机 程控交换机 集团电话 集装袋 混合机混合机 混合机捏合机 捏合机 捏合机导热油炉 导热油炉 导热油炉 反应釜 反应釜 反应釜 回流焊 波峰焊 spherical roller bearing 搬运车 搬运车 电动搬运车 油桶搬运车 堆高车 电动堆高车 半电动堆高车 堆垛车 高空作业平台车 电动叉车 平衡重叉车 前移叉车 电瓶叉车 苗木价格 苗木信息 标牌制作 深圳标牌 儿童摄影 北京儿童摄影 防静电鞋 淘宝刷信誉 威海凤凰湖 威海海景房 大庆密封件 打标机 淘宝刷信誉 TESOL/TEFL国际英语教师证书 英语教师进修及培训 韩国饰品批发 代写论文 代写论文 代写论文 代写代发 论文代写 电源模块 模块电源 X架 超薄灯箱> 易拉宝 展柜制作 代理服务器 游戏加速器 网络加速器 网通加速器 电信加速器 电信网通转换器 电信网通加速器 网通电信互转 网通电信互通 网络游戏加速器 美国VPN代理 美国独享VPN 美国独享IP pvc ceiling panel Spherical roller bearings 天龙八部私服 SEO优化 安全鞋 劳保鞋 防砸鞋 电绝缘鞋 上海安全鞋 上海劳保鞋 江苏劳保鞋 服装软件 服装管理软件 进销存软件 进销存管理软件 服装管理系统 服装进销存软件 进销存系统 进销存管理系统 免费进销存软件 吉林中医 东北特产 打包机 dhl 阳痿 阴茎短小 阴茎增大 早泄 前列腺炎 阴茎增粗 阴茎延长 国际机票 上海国际机票 国际打折机票 国际特价机票 CRM 客户管理软件 客户关系管理 免费客户管理软件 客户管理软件下载 客户信息管理系统 销售管理系统 销售管理 CRM系统 CRM软件 客户关系管理系统 客户关系管理软件 客户管理 客户管理系统 营销管理系统 客户资源管理 销售管理软件 客户资料管理软件 客户资源管理软件 客户信息管理软件 客户资料管理 客户资源管理 客户信息管理 客户资料管理系统 客户资源管理系统 客户管理软件免费版 砂磨机 砂磨机 砂磨机 卧式砂磨机 卧式砂磨机 卧式砂磨机 三辊研磨机 三辊研磨机 三辊研磨机 混合机 混合机 混合机 锥形混合机 锥形混合机 锥形混合机 行星动力混合机 行星动力混合机 行星动力混合机 无重力混合机 无重力混合机 无重力混合机 干粉砂浆设备 干粉砂浆设备 干粉砂浆设备 捏合机 捏合机 捏合机 导热油炉 导热油炉 导热油炉 反应釜 反应釜 反应釜 搪玻璃反应釜 搪玻璃反应釜 搪玻璃反应釜 乳化机 涂料设备 干混砂浆设备 无重力混合机 胶体磨 涂料成套设备 双螺旋混合机 北京婚庆 北京婚庆公司 400电话 办证 呼吸机 制氧机 亚都 亚都加湿器 亚都净化器 亚都装修卫士 饰品批发 小饰品批发 韩国饰品 韩国饰品批发 premature ejaculation penis enlargement 破碎机 制砂机 球磨机 雷蒙磨 雷蒙磨粉机 鄂式破碎机 鄂式破碎机 免烧砖机 加气混凝土设备 反击式破碎机 选矿设备 安利产品 马来西亚留学 网站优化 网站推广 衬布 代写论文 代写论文 代写论文 论文代写 代写论文 代写硕士论文 代写毕业论文 磁力泵 离心泵 化工泵 隔膜泵 螺杆泵 潜水泵 油泵 耐腐蚀泵 泵 水泵 拖链 防护罩 排屑机 塑料拖链 钢铝拖链 水泵 磁力泵 隔膜泵 离心泵 液下泵 自吸泵 多级泵 排污泵 螺杆泵 油泵 化工泵 电动隔膜泵 气动隔膜泵 自吸式磁力泵 氟塑料磁力泵 管道离心泵 导热油泵 深井泵 潜水泵 污水泵 潜水排污泵 深圳装饰 深圳装饰公司 深圳装修公司 特价机票 打折机票 国际机票 机票 新风换气机 换气机 立式新风换气机 风机箱 新风系统 能量回收机 搅拌机 混合机 乳化机 分散机 毛刷 毛刷辊 工业毛刷 刷子 钢丝刷 涂层测厚仪 硬度计 兆欧表 激光测距仪 测振仪 转速表 温湿度计 风速仪 超声波测厚仪 粗糙度仪 噪音计 红外测温仪 万用表 硬度计 万用表 美容院 美容加盟 澳洲留学 澳大利亚留学 什么是法兰 电烤箱 酒店预定 北京酒店预定 北京酒店 离心机 nail equipment nail products nail product nail uv lamp nail uv lamp nail uv lamps uv nail lamp nail brush nail file nail tool nail tip nail gel curing uv lamps lights 万用表 风速仪 红外测温仪 噪音计

  • 123, 10 months later:

    情趣用品,情趣用品,情趣用品,情趣用品,情趣用品,情趣,情趣,情趣,情趣,情人歡愉用品,情惑用品性哥,情人用品性哥,情趣用品,AIO交友愛情館,情人歡愉用品,美女視訊,情色交友,情人用品性哥,視訊交友,辣妹視訊,美女交友,性愛,嘟嘟成人網,按摩棒,震動按摩棒,微調按摩棒,情趣按摩棒,逼真按摩棒,G點,跳蛋,跳蛋,跳蛋,性感內衣,飛機杯,充氣娃娃,情趣娃娃,角色扮演,性感睡衣,後庭區,SM,潤滑液,情趣禮物,威而柔,香水,精油,芳香精油,自慰,自慰套,性感吊帶襪,情趣用品加盟,情人節禮物,情人節,吊帶襪,辣妹視訊,美女交友,情色交友,成人交友,視訊聊天室,美女視訊,視訊美女,情色視訊,免費視訊聊天,視訊交友,視訊聊天,AIO交友愛情館,嘟嘟成人網,成人貼圖,成人網站,AIO交友愛情館,情色,情色貼圖,情色文學,情色交友,色情聊天室,色情小說,七夕情人節,色情,A片,A片下載,免費A片,免費A片下載,情色視訊,情色電影,色情網站,辣妹視訊,視訊聊天室,情色視訊,免費視訊聊天,視訊聊天,美女視訊,視訊美女,美女交友,美女,情色交友,成人交友,自拍,本土自拍,情人視訊網,視訊交友90739,生日禮物,情色論壇,正妹牆,正妹,成人網站,A片,免費A片,A片下載,免費A片下載,AV女優,成人影片,色情A片,成人論壇,情趣,免費成人影片,成人電影,成人影城,愛情公寓,色情影片,保險套

  • 888, 10 months later:

    情人歡愉用品 高雄轉角情趣用品 花美姬情趣用品 花美姬情趣用品 情人視訊網 花美姬情趣用品 免費A片下載 按摩棒 情趣用品自慰套 跳蛋 高雄轉角情趣用品 性感睡衣 情人節禮物 高雄轉角情趣用品 情人歡愉用品 花美姬情趣用品 情人用品性哥 情人歡愉用品 高雄轉角情趣用品 花美姬情趣用品 花美姬情趣用品 情人視訊網 花美姬情趣用品 免費A片下載 按摩棒 情趣用品自慰套 跳蛋 高雄轉角情趣用品 性感睡衣 情人節禮物 高雄轉角情趣用品 情人歡愉用品 花美姬情趣用品 情人用品性哥 情人歡愉用品 高雄轉角情趣用品 花美姬情趣用品

  • qw, 10 months later:

    Thanks so much for this! This is exactly what I was looking for

    mirc mırc mırç mirç mirc indir mirc yükle mirc yukle türkçe mirc mirc indir mirc islami sohbet kelebek kelebek script kelebek sohbet kelebek mirc chat çet cet çet odaları sohbet kanalları sohbet odaları kameralı sohbet kameralı chat sohbet eğlence mirc sohbet odaları sevgili arkadaş arkadaş bul arkaraş ara oto araba şarkı sözleri astroloji ikinci el telefon gazete gazeteler günlük gazeteler marifetname bedava domain ücretsiz domain benimurl parça kontör parça kontör radyo dinle bedava blog ücretsiz blog

  • , 10 months later:

    Victorias Secret Victoria’s Secret Fashion show Victorias Secret Pink Victorias Secret Model Victorias Secret Credit Card Victorias Secret Coupon Code Victorias Secret Lingerie Victorias Secret Fashion Show 2005 Victorias Secret Fashion Show 2006 Victorias Secret Bra Victorias Secret Catalog Victorias Secret Pantie Victorias Secret Online Coupon Victorias Secret Fashion Show 2007 Victorias Secret Girl Free Shipping Victorias Secret Victorias Secret Home Victorias Secret Christmas Victoria’S Secret Pink Dog Victorias Secret Music Victorias Secret Semi Annual Sale Victorias Secret Jobs Victorias Secret Free Shipping Code Victorias Secret Shoes Victorias Secret Thong Victorias Secret Commercial Victorias Secret Promotional Code Victorias Secret Love Spell Victorias Secret Boots Victorias Secret Employment Victorias Secret Reviews Victorias Secret Jeans Victorias Secret Brasil Victorias Secret Bag

  • , 10 months later:

    情人用品,情人用品性哥,情 人用品,情趣用品,視訊交友,視訊美女,視訊美女,視訊交友網,視訊聊天室,視訊聊天室,視訊 交友網,免費視訊聊天,辣妹視訊,辣妹視訊,情人視訊網

  • dd, 10 months later:

    徵信社,案件討論,男女專區,法律諮詢,相關新聞,情趣用品,情趣用品,情趣精品,情趣用品,情趣用品,情趣用品,情趣用品,威而柔,自慰套,自慰套,SM,充氣娃娃,充氣娃娃,潤滑液,飛機杯,按摩棒,跳蛋,性感睡衣

    威而柔,自慰套,自慰套,SM,充氣娃娃,充氣娃娃,潤滑液,飛機杯,按摩棒,跳蛋,性感睡衣,視訊交友90739,情人視訊網,情色交友,視訊交友,辣妹視訊,美女視訊,aio交友愛情館,情色論壇,成人論壇,免費視訊聊天,辣妹視訊,視訊交友網,美女視訊,視訊交友,成人視訊,情趣用品,成人聊天室,情趣,情趣,視訊聊天室,視訊聊天,視訊聊天室,情色視訊,情人視訊網,免費視訊聊天室,aio交友愛情館,色情遊戲,寄情築園小遊戲,情色文學,一葉情貼圖片區

  • oyun oyna, 11 months later:

    Bedava Oyunlar kız oyunları macera oyunları yarış oyunları oyun oyna oyunlar oyun hedef oyunları spor oyunları dövüş oyunları çizgi film oyun hileleri zeka oyunları hedef oyunları çocuk oyunları işletme oyunları 3 boyutlu oyunlar oyun videoları izle çizgi film izle animasyon oyunlar 1 oyunlar1 oyunambari minikperi kraloyun kral oyun oyunlar1 rixoyun rix oyun fixoyun fix oyun oyunlife oyunmemo oyunyolu oyun99 oyun oyna oyun sitesi oyun siteleri oyun ara oyun oyunlar barbie oyunu barbie oyunları barbie oyunlar barbie winx oyunu winx club winx oyunları winx bratz oyunu bratz oyunları bratz oyunu giysi oyunu giydirme oyunu kıyafet oyunu giydirme oyunları giysi oyunları giysi giydirme oyunu giysi giydirme oyunları makyaj oyunları makyaj oyunu makyaj yapma oyunları yemek oyunları yemek yapma oyunları pasta oyunları pasta süsleme oyunları futbol oyunları çocuk oyunları yarış oyunları boyama oyunları araba oyunları araba yarışı oyunları motor oyunları basketbol oyunları beceri oyunları dövüş oyunları manken oyunları komik oyunlar oda oyunları spor oyunları zeka oyunları yapboz oyunları cep oyunları yeni oyunlar oyunambari oyuncambazi oyun sitesi oyun siteleri oyun hileleri hileler çizgi film cep oyunu oyun oyns oyun oyna video izle chip oyun barbie oyunu kız oyunları sue oyunları güzel oyunlar pop oyunlar pop oyun popoyunlar popoyun popoyunları pop oyun popoyunlar popoyun popoyunları çizgi film izle çizgi film seyret çocuk çizgi film izle şirinler çizgi film izle tom ve jery çizgi film izle cizgi film izle çizgi film cocuk sitesi cocuk siteleri cocuk sitesi cocuk sitesi cizgi film seyret çocuk cizgi film izle şirinler cizgi film izle tom ve jery cizgi filmi izle Aksiyon Macera Oyunları Macera Oyunları Motor Oyunları Mario Oyunları Strateji Taktik Oyunları Yemek Pişirme Oyunları Dekor Oyunları Boyama Kitabı Oyunları Hugo Oyunları Sonic Oyunları Webcam Oyunları Peri Güzellik Oyunları Battleon Oyunları Bebek Oyunları Süper Oyunlar İlizyon Oyunları Komik Oyunlar Çocuk Oyunu Çocuk Oyunları işletme Oyunları işletme Oyunu Teletabi Oyunları Define Hazine Gömü

  • jj, 11 months later:
    :-)))) Very interesting! Thanks!!!

    phone sex phone sex phone sex phone sex phone sex phone sex phone sex phone sex phone sex phone sex phone sex phone sex phone sex phone sex mootzie cosmology edvard munch humorous quotations hundredth monkey brain teasers jillian ann shakespeare quotations bride of frankenstein gettysburg address bill of rights van gogh bowling tips violin books eden prosper julia dreyfus violin bows chess download xslt aviation funny quotes xslt tips gothic abs self hypnosis gothic clothes monique olivia noda amanda roberts somethings happening bgreen68 bfire3 reldeve links psychology hypnosis phonesex phonesex phonesex phonesex phonesex phonesex phonesex phonesex phonesex phonesex phonesex phonesex phonesex phonesex mootzie buffys bedroom blog the great adventure