public function saveAs(Io_File $file_)
 {
     $this->engine()->save($file_->m_pathAsString, $file_->getMimetype());
     return $this;
 }
 public function printFile(Io_File $file_, $subPath_, $mimeTypeIconSize_ = Io_Mimetype::ICON_SIZE_64)
 {
     $actions = [];
     foreach ($this->m_fileActionsJs as $name => $action) {
         if (false === ($callback = call_user_func_array($action['callback'], [$file_]))) {
             continue;
         }
         $function = array_shift($callback);
         $actions[] = sprintf('<a href="javascript:void(0);" onclick="%3$s(%4$s);" class="%1$s">%2$s</a>', $name, $action['title'], $function, strtr(json_encode(array_merge([$subPath_], $callback)), '"', "'"));
     }
     $actionRemove = sprintf('<a href="javascript:void(0);" onclick="%3$s" class="%1$s">%2$s</a>', 'remove', 'Remove', $this->callback(['remove' => $subPath_]));
     echo '<div class="file">';
     if ($mimeTypeIconSize_ > Io_Mimetype::ICON_SIZE_16) {
         printf('
       <div class="icon">
         <img src="%1$s" alt="%2$s" title="%2$s"/>
       </div>
       <div class="info">
         <a href="javascript:void(0);" class="label">%2$s</a>', $file_->getMimetype()->icon($mimeTypeIconSize_), $subPath_);
         array_unshift($actions, $actionRemove);
     } else {
         printf('
       <div class="info">
         <img src="%1$s" alt="%2$s" title="%2$s"/>
         <a href="javascript:void(0);" class="label">%2$s</a>', $file_->getMimetype()->icon($mimeTypeIconSize_), $subPath_);
         array_push($actions, $actionRemove);
     }
     printf('
         <span class="type">%1$s</span>
         <span class="size">%2$s</span>
         <span class="links">%3$s</span>
       </div>
       <br class="clear"/>
     </div>', ucfirst($file_->getMimetype()->title()), $file_->getSize()->formatAsBytes(2), implode(' | ', $actions));
 }